请问一个关于网络字节序的相关问题!

本文介绍如何使用网络字节序在网络通信中正确表示字符串长度,包括发送方如何构造包含字符串长度的数据包,以及接收方如何解析该数据包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在做一个项目,需要同老外的服务器做接口
其协议定义是这样的
<8>PASYSTEM
其中PASYSTEM表示字符串,而<8>表示的是PASYSTEM的长度
这里的<8>是两字节的网络字节序(短整形),它既不是string类型,也不是char类型
下面这句话是老外的原文
Please note that <8> is a 2 byte network byte order (short Integer). It is
>not a STRING or CHARACTER.

现在我的疑问是,我在写程序时,需要将<8>PASYSTEM发送给server,那么我该怎么格式化
<8>PASYSTEM呢?就是说,我要将<8>PASYSTEM以字符串的形式发送给server,但是其中<8>是两字节
的 网络字节序,该如何表示他呢?

假如我接收到了<8>PASYSTEM,我怎么样识别其中的两字节的字符串的长度8和其详细内容

谢谢



==========================================================================

<8>PASYSTEM,老外的意思是,2个字节存放整数,代表后面字符串的长度,2个字节后面紧跟对应长度的字符数

8作为整型数字,0x0008,这是short表示,在内存中低字节在前,高字节在后0x08,0x00注意这不是网络字节顺序,而是主机字节顺序
通常我们htons((unsigned short)8)转换之后就可以得到网络字节顺序

假设一个字符串10位ok,按照老外的要求那么前两个字节应该放入
BYTE buffer[10+2];
memset(buffer,0,sizeof(buffer));
buffer[0]=(BYTE)(htons((unsigned short)10)&0x00ff);//网络字节顺序的低字节
buffer[1]=(BYTE)((htons((unsigned short)10)&0xff00)>>8););//网络字节顺序的高字节

memmove(buffer+2,_T("abcdefghig"),_tcslen(_T("abcdefghig")));
这样缓冲区里的应该就是
0x00,0x0A,'a','b','c','d','e','f','g','h','i','g'

你就可send了

不过建议你定义个struct
typedef struct pkg
{
   unsigned short len;
   TCHAR  str[MAXSIZE];
}PKG;
PKG tmp;
memset(tmp,0,sizeof(PKG));
tmp.len=htons(8);
memmove(tmp.str,_T("PASYSTEM"),_tcslen(_T("PASYSTEM")));

send(tmp...);


如果你接受到
PKG tmprecv;
memset(tmprecv,0,sizeof(PKG));

//此处假设是定长包
memmove(tmprecv,recvbuffer/*你接受到字节流*/,tmprecv);
tmprecv.len=ntohs(tmprecv.len);
//根据len取tmprecv.str总足够的字节数给一个字符串变量就可以了

以上memmove过程中没有检查目标缓冲区和源缓冲区的大小,因为假设包定长,且maxsize足够大
只是用来解释,具体应用根据实际情况可改为动态分配和大小检查

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值