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]);
}
------------