首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C下通过socket收发十六进制数据解决方案

2012-03-17 
C下通过socket收发十六进制数据系统是在LINUX下,下位机发送十六进制数据过来 上位机怎么解析 把数据以十六

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;
[解决办法]

C/C++ code
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);    }}
[解决办法]
探讨

就是 下位机发送 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff
然后打印输出是 33221100
77665544
bbaa9988
ffeeddcc
这样的

[解决办法]
一行打印所有数据,什么意思?
另外
printf("recv msg from client: %s\n", buff);
这个%s能把收到的16进制当字符串输出来?0x00打出"00"?

那部分的完整代码贴一下吧
[解决办法]
探讨

引用:
引用:

就是 下位机发送 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff
然后打印输出是 33221100
77665544
bbaa9988
ffeeddcc
这样的

大小字节序问题。
可以用socket库的
ntohl
h……

热点排行