日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux socket接收不到16进制数据,C下通过socket收发十六进制数据解决办法

發布時間:2023/11/30 linux 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux socket接收不到16进制数据,C下通过socket收发十六进制数据解决办法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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,('!'

}

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

sprintf(binstr,"%s???",binstr);

}

sprintf(binstr,"%s??",binstr);

k=16-k;

for?(j=i-k;j

sprintf(binstr,"%s%c",binstr,('!'

}

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

{

printf("%X?",?buffer[i]);

}

------------

總結

以上是生活随笔為你收集整理的linux socket接收不到16进制数据,C下通过socket收发十六进制数据解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。