socket传输十六进制数的问题?

happy819 2011-03-01 10:47:46
小弟愚钝,对byte的操作一直不是很了解,只是知道了一点皮毛,有个问题搞了一下午还没搞定。
具体是这样的,我要进行客户端的编程,server端的数据协议已经是定好的,server端认为收到的数据格式为:
03 04
01
01
00 01
00 00 00 02
00 00 00 01
分为上述几段,为了查看方便,每段我用了回车分开,其实有些段根本用不了4位(比如00 00 00 01,只是用1计算得来的),但是为了扩展,占了4位。其中第一段0304为十进制772,我实现了部分代码,但发现总是有问题:

 BYTE byBuffer[1024] = {0};	

//0304
DWORD dwData = htons(772);
strncat((LPSTR)byBuffer, (LPSTR)&dwData, 2);

//01
dwData = 1;
strncat((LPSTR)byBuffer, (LPSTR)&dwData, 1);
//01
dwData = 1;
strncat((LPSTR)byBuffer, (LPSTR)&dwData, 1);


//00 01
dwData = 0;
strncat((LPSTR)byBuffer, (LPSTR)&dwData, 1);
dwData = 1;
strncat((LPSTR)byBuffer, (LPSTR)&dwData, 1);

//00 00 00 02
dwData = 0;
strncat((LPSTR)byBuffer, (LPSTR)&dwData, 1);
dwData = 0;
strncat((LPSTR)byBuffer, (LPSTR)&dwData, 1);
dwData = 0;
strncat((LPSTR)byBuffer, (LPSTR)&dwData, 1);
dwData = 2;
strncat((LPSTR)byBuffer, (LPSTR)&dwData, 1);

//00 00 00 01
dwData =0;
strncat((LPSTR)byBuffer, (LPSTR)&dwData, 1);
dwData = 0;
strncat((LPSTR)byBuffer, (LPSTR)&dwData, 1);
dwData = 0;
strncat((LPSTR)byBuffer, (LPSTR)&dwData, 1);
dwData = 1;
strncat((LPSTR)byBuffer, (LPSTR)&dwData, 1);

send( mySocket, (LPCSTR)byBuffer, 1024, 0);

最后发出去的数据为:
03 04 01 01 01 02 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (后面省略了很多00)
其中只有前面(03 04 01 01)这部分是我想要的结果,中间有一部分00没有传过去,不知道怎么搞呢?
...全文
416 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
happy819 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wangningyu 的回复:]

引用楼主 happy819 的回复:
小弟愚钝,对byte的操作一直不是很了解,只是知道了一点皮毛,有个问题搞了一下午还没搞定。
具体是这样的,我要进行客户端的编程,server端的数据协议已经是定好的,server端认为收到的数据格式为:
03 04
01
01
00 01
00 00 00 02
00 00 00 01
分为上述几段,为了查看方便,每段我用了回车分开,其实有……
[/Quote]

我知道是要组织字节数组的包,我就是不知道怎么组织才来发帖的,不然我吃饱了撑着来逗大家开心?如果你知道怎么做就告诉我,不知道就不要给我讲理论。
happy819 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wangningyu 的回复:]

引用楼主 happy819 的回复:
小弟愚钝,对byte的操作一直不是很了解,只是知道了一点皮毛,有个问题搞了一下午还没搞定。
具体是这样的,我要进行客户端的编程,server端的数据协议已经是定好的,server端认为收到的数据格式为:
03 04
01
01
00 01
00 00 00 02
00 00 00 01
分为上述几段,为了查看方便,每段我用了回车分开,其实有……
[/Quote]

我晕,我知道传输的是二进制,是010101010101,我发帖想要的是解决我问题的具体方案,不是要听理论。
汪宁宇 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 happy819 的回复:]
小弟愚钝,对byte的操作一直不是很了解,只是知道了一点皮毛,有个问题搞了一下午还没搞定。
具体是这样的,我要进行客户端的编程,server端的数据协议已经是定好的,server端认为收到的数据格式为:
03 04
01
01
00 01
00 00 00 02
00 00 00 01
分为上述几段,为了查看方便,每段我用了回车分开,其实有些段根本用不了4位(比如00 00……
[/Quote]

lz有些画蛇添足,socket传输单元本来就是字节(即char),跟进制无关!

至于你说的进制,只是这个字节显示的方式而已,在内存中均以16进制存储,所以你只要组织好你关于字节数组的包就完了....
happy819 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xianglitian 的回复:]

引用 13 楼 happy819 的回复:

问题的关键在于一次性既要传送整数,又要传送字符串,不知道怎么连起来,如果像上面那样仅仅传送几个整数还行,如果有很长的一段字符串怎么办呢?

不管是整数还是字符串
对于计算机来说都是一系列数
用BTYE处理都是没有问题的
至于如何区分出来就看你协议怎么制定了
[/Quote]

我知道用byte处理是可以,但是我想请教大家给个好点的方案,上面描述了997840219,应该传送3B 79 D5 5B,我可以先转为十六进制,再拆分出4段加到byte数组里去,我想知道有没有好的处理方法。
向立天 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 happy819 的回复:]

问题的关键在于一次性既要传送整数,又要传送字符串,不知道怎么连起来,如果像上面那样仅仅传送几个整数还行,如果有很长的一段字符串怎么办呢?
[/Quote]
不管是整数还是字符串
对于计算机来说都是一系列数
用BTYE处理都是没有问题的
至于如何区分出来就看你协议怎么制定了
happy819 2011-03-02
  • 打赏
  • 举报
回复
问题的关键在于一次性既要传送整数,又要传送字符串,不知道怎么连起来,如果像上面那样仅仅传送几个整数还行,如果有很长的一段字符串怎么办呢?
happy819 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 visualeleven 的回复:]

你就发送BYTE[]就好了,注意发送的长度是BYTE[]的字节的大小
[/Quote]

我试了一下,可行:
BYTE byBuffer[1024] = {0};
byBuffer[0] = 03;
byBuffer[1] = 04;
byBuffer[2] = 01;
byBuffer[3] = 01;
byBuffer[4] = 0;
byBuffer[5] = 01;
byBuffer[6] = 0;
byBuffer[7] = 0;
byBuffer[8] = 0;
byBuffer[9] = 02;
byBuffer[10] = 0;
byBuffer[11] = 0;
byBuffer[12] = 0;
byBuffer[13] = 01;

但是有个问题,中间有段数据是long型转换的比如997840219,应该传送3B 79 D5 5B,如果向上面那样传的话我还得先转为16进制的3B79D55B,然后还要拆成4段加到数组里面去?并且要传送的数据里还有一段字符串,也要拆解?
Eleven 2011-03-02
  • 打赏
  • 举报
回复
你就发送BYTE[]就好了,注意发送的长度是BYTE[]的字节的大小
happy819 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chen_jun_fen 的回复:]

不要用字符串来处理,即不要使用 strcpy,strcat,strlen等字符串操作函数。
就当内存块来处理就行。memcpy,memset 等函数来操作
[/Quote]

详细?
chen_jun_fen 2011-03-02
  • 打赏
  • 举报
回复
不要用字符串来处理,即不要使用 strcpy,strcat,strlen等字符串操作函数。
就当内存块来处理就行。memcpy,memset 等函数来操作
happy819 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sxqinge 的回复:]

按楼主的举例为例,我定义个数组:ULONG Send[1024];
第一行就是0x304,那么有Send[0]=0x304...如此类推
或者:
定义个数组 UCHAR Send[1024];
第一行就是Send[0]=0x00,Send[1]=0x00,Send[2]=0x03,Send[3]=0x04...
然后再设置个循环依次把数据发送就可以了,何必还要进行个字符串链接呢?
[/Quote]

是要一次发送出去,不能发多次,如果用这样的数据最后怎么变成char *,因为socket的send是要发char *
jwybobo2007 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 happy819 的回复:]
小弟愚钝,对byte的操作一直不是很了解,只是知道了一点皮毛,有个问题搞了一下午还没搞定。
具体是这样的,我要进行客户端的编程,server端的数据协议已经是定好的,server端认为收到的数据格式为:
03 04
01
01
00 01
00 00 00 02
00 00 00 01
分为上述几段,为了查看方便,每段我用了回车分开,其实有些段根本用不了4位(比如00 00……
[/Quote]

既然是二进制数据,就不应该使用strncat这类的字符串处理函数,改用memcpy,memset之类的函数
happy819 2011-03-02
  • 打赏
  • 举报
回复
已经解决,谢谢大家的建议。
happy819 2011-03-01
  • 打赏
  • 举报
回复
各段具体值代表后面括号内的十进制数字:

03 04 (722)
01 (1)
01 (1)
00 01 (1)
00 00 00 02 (2)
00 00 00 01 (1)
happy819 2011-03-01
  • 打赏
  • 举报
回复
其中0304代表十进制的722。
happy819 2011-03-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sxqinge 的回复:]

LZ,你说下你想发送的完整命令是什么
另外有个建议,数据本来就是用16进制方式存储的,你为什么非得再转换为十进制?多此一举。可以设一个数组来保存你要发送的命令,根据你的描述,数据应该是高字节在前,低字节在后的吧?
[/Quote]

我就是想传出去的十六进制数据为:(因为server端不受我控制,我只能通过网络工具比如wpe或者snifer截取到我传送的数据十六进制为下面的字符就行了。)
03 04
01
01
00 01
00 00 00 02
00 00 00 01
sxqinge 2011-03-01
  • 打赏
  • 举报
回复
按楼主的举例为例,我定义个数组:ULONG Send[1024];
第一行就是0x304,那么有Send[0]=0x304...如此类推
或者:
定义个数组 UCHAR Send[1024];
第一行就是Send[0]=0x00,Send[1]=0x00,Send[2]=0x03,Send[3]=0x04...
然后再设置个循环依次把数据发送就可以了,何必还要进行个字符串链接呢?
sxqinge 2011-03-01
  • 打赏
  • 举报
回复
LZ,你说下你想发送的完整命令是什么
另外有个建议,数据本来就是用16进制方式存储的,你为什么非得再转换为十进制?多此一举。可以设一个数组来保存你要发送的命令,根据你的描述,数据应该是高字节在前,低字节在后的吧?
lijianli9 2011-03-01
  • 打赏
  • 举报
回复
这部分是我想要的结果,中间有一部分00没有传过去,不知道什么意思》

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧