C下通过socket收发十六进制数据
系统是在LINUX下,下位机发送十六进制数据过来 上位机怎么解析 把数据以十六进制的形式显示出来,发送十六进制又如何实现
[解决办法]
socket不就是发16进制的么
[解决办法]
那你 把buff里的有效数据按照发送的格式转换回去.
[解决办法]
socket发送数据的时候是按位(bit)发送的,和是不是16进制有什么关系,
int a = 0x01;
send(socket_id,&a,sizeof(a));
接收:
int b;
recv(socket_id,&b,sizeof(b));
也许你说的是发送边界的问题,socket发送和接受数据的时候是比特流,如果你使用的是tcp的话,会要求考虑消息边界的问题,涉及解包。
[解决办法]
你怎么发的??
[解决办法]
楼主是不是这个意思: 例如十进制数23,下位机发送的是其十六进制值17,上位机接收到数据后,想要显示成原来的十进制值23?而此时上位机接收到的值直接打印出来,却是ASCII值17?
如果是这个意思就很好办,将收到的数据由十六进制转化成十进制就可以了
char a, b;
b = a / 10 * 16 + a % 10;
[解决办法]
void HexDump(char *buf,int len) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%04x -",i);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
[解决办法]
大小字节序问题。
可以用socket库的
ntohl
htonl
来转。
[解决办法]
一行打印所有数据,什么意思?
另外
printf("recv msg from client: %s\n", buff);
这个%s能把收到的16进制当字符串输出来?0x00打出"00"?
那部分的完整代码贴一下吧
[解决办法]
因为你两端的机器对高低位 处理不同。
ntohl和htonl是 机器无关的传送方法
[解决办法]
你recv的length要跟send的相同
[解决办法]
read(clientidone, &buff,sizeof(buff));
接受后ntohl转一下,另外判断下read的返回值,看看是否读取了sizeof(buff)个字节。不然会出问题。
在while前先
printf("recv msg from client: ");
然后while中的printf改成
printf("%x", buff);
不就没换行了
你加了'\n'换行,当然会换行
[解决办法]
send的是buffer中的数据
和什么数制没有关系吧
[解决办法]
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
------解决方案--------------------
char buffer[] = {00, 11, 22, 33, 44, 55, 66 ,77, 88, 99, 00};
int i = 0;
int size = sizefo(buffer)/sizeof(char);
for(i=0;i<size;i++)
{
printf("%X ", buffer[i]);
}
------------
不就是这样显示吗
[解决办法]
recv(socket_id,&b,sizeof(b));
也许你说的是发送边界的问题,jpf886.comsocket发送和接受数据的时候是比特流,如果你使用的是tcp的话,会要求考虑消息边界的问题,……
[解决办法]
大小端模式的问题,网络序是大端模式,主机序是小端模式,肯定不对啊
[解决办法]
去了 \n 不显示可能和linux的输出缓存有关。屏幕上通常是行缓存,即换行时才输出到屏幕。printf后,可以自己fflush下。
[解决办法]
printf("data:");
for(unsigned short i = 0; i < data_size; ++i)
{
printf("%02x", packet_buffer[i]);
}
printf("\n");
[解决办法]
这种情况好像是endain的问题,就是说你的处理器是little endian的(其实大部分的intel CUP都是little endian的方式),而所有网络传输是用big endian的。所以就出现这种情况了,你可以试试下面的这个方法:
如果是long型数据 var = ntohl(val);
如果是short数据 var = ntohs(val);