Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++/C:将长度前置到字符[],以字节为单位(二进制/十六进制)_C++_C_Type Conversion_Udp_Hex - Fatal编程技术网

C++/C:将长度前置到字符[],以字节为单位(二进制/十六进制)

C++/C:将长度前置到字符[],以字节为单位(二进制/十六进制),c++,c,type-conversion,udp,hex,C++,C,Type Conversion,Udp,Hex,我希望将UDP数据报从客户端发送到服务器,然后再发送回来 服务器需要为每个数据报添加一个头,该数据报以字节格式表示为char[],我一直在努力寻找这样的示例。我知道如何将其作为实际文本字符发送,但我想将其作为有效的二进制形式发送,例如,如果长度为40字节,那么我希望在0x28或2字节无符号等效字符之前添加前缀,而不是ASCII字符形式或类似形式的“0028”,即4字节而不是潜在的2字节 据我所知,我的最佳选择如下: unsigned int length = dataLength; //leng

我希望将UDP数据报从客户端发送到服务器,然后再发送回来

服务器需要为每个数据报添加一个头,该数据报以字节格式表示为char[],我一直在努力寻找这样的示例。我知道如何将其作为实际文本字符发送,但我想将其作为有效的二进制形式发送,例如,如果长度为40字节,那么我希望在0x28或2字节无符号等效字符之前添加前缀,而不是ASCII字符形式或类似形式的“0028”,即4字节而不是潜在的2字节

据我所知,我的最佳选择如下:

unsigned int length = dataLength; //length of the data received

char test[512] = { (char)length };
这种方法有效吗,还是会在以后引起问题

此外,如果我没有弄错的话,这给了我一个255的硬限制。如何最好地将其表示为2个字节以扩展最大长度


编辑:我需要在每个数据报的长度之前加上前缀,因为我将把每个数据报构建成一个更大的框架,接收者需要能够将框架分解成每个信息元素,我想这意味着我需要包含长度,以便收件人和计算每个元素的结束位置和下一个元素的开始位置

您可能需要这样的内容:

  char somestring[] = "Hello World!";
  char sendbuffer[1000];

  int length = strlen(somestring);
  sendbuffer[0] = length % 0xff;         // put LSB of length
  sendbuffer[1] = (length >> 8) & 0xff;  // put MSB of length

  strcpy(&sendbuffer[2], somestring);    // copy the string right after the length
sendbuffer是将要发送的缓冲区;我将它的最大长度固定为1000,允许长度不超过997的字符串发送1000-2字节的长度-1字节的NUL终止符

LSB表示最低有效字节,MSB表示最高有效字节。这里我们把LSB放在第一位,把MSB放在第二位,这个约定称为小端点,反之则称为大端点。您需要确保在接收器端正确解码长度。如果接收方的体系结构与发送方不同,则接收方的长度可能会根据代码被解码错误。谷歌endianness了解更多细节

sendbuffer在内存中的外观如下:

 0x0c 0x00 0x48 0x65 0x6c 0x6c ...
|   12    |'H' |'e' |'l' |'l '| ...
可能的优化:


如果您发送的大多数字符串的长度小于255,您可以进行优化,并且在大多数情况下不系统地预加两个字节,而只预加一个字节,但这是另一回事。

如果接收方希望此长度为ASCII,则将其作为二进制发送将导致接收方出错。另外还有发送二进制数的endian问题。最后,UDP在协议中内置了消息长度。我还在开发接收器,因此可以在另一端进行转换。对不起,请问您能解释一下发送二进制数的endian问题是什么意思吗?我也知道UDP内置了它,但这个项目的要求包括添加我自己的长度和其他标题信息,对不起:。@GeorgeG google endianness如果在开发客户端和服务器时连接的两端都由我控制,我会认为这不太可能引起问题。如果我错了,请纠正我!:这看起来不错!我会在最后测试它,确保在勾选答案之前我理解它。谢谢。请注意,长度不包括nul终止符。实际上,您不需要传输nul终止符-它可以附加在接收器端。
  //... Decoding (assuming short is a 16 bit type on the receiver side)

  // first method (won't work if endiannnes is different on receiver side)
  int decodedlength = *((unsigned short*)sendbuffer);       

  // second method (endiannness safe)
  int decodedlength2 = (unsigned char)sendbuffer[0] | (unsigned char)sendbuffer[1] << 8;


  char decodedstring[1000];
  strcpy(decodedstring, &sendbuffer[2]);