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

C停通过socket收发十六进制数据

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

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
这样的

大小字节序问题。
可以用socket库的
ntohl
htonl
来转。


[解决办法]
一行打印所有数据,什么意思?
另外
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……

因为你两端的机器对高低位  处理不同。
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,&amp;b,sizeof(b));
也许你说的是发送边界的问题,jpf886.comsocket发送和接受数据的时候是比特流,如果你使用的是tcp的话,会要求考虑消息边界的问题,……



[解决办法]
大小端模式的问题,网络序是大端模式,主机序是小端模式,肯定不对啊


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

[解决办法]
引用:
引用:
read(clientidone, &amp;amp;buff,sizeof(buff));
接受后ntohl转一下,另外判断下read的返回值,看看是否读取了sizeof(buff)个字节。不然会出问题。
在while前先
printf("recv msg from client: ");
然后while中的printf改……

去了 \n 不显示可能和linux的输出缓存有关。屏幕上通常是行缓存,即换行时才输出到屏幕。printf后,可以自己fflush下。
[解决办法]
printf("data:");
for(unsigned short i = 0; i < data_size; ++i)
{
printf("%02x", packet_buffer[i]);
}
printf("\n");

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


这种情况好像是endain的问题,就是说你的处理器是little endian的(其实大部分的intel CUP都是little endian的方式),而所有网络传输是用big endian的。所以就出现这种情况了,你可以试试下面的这个方法:
如果是long型数据    var = ntohl(val);
如果是short数据     var = ntohs(val);

热点排行