C++/C : Prepend length to Char[] in bytes (binary/hex)

标签 c++ c type-conversion udp hex

我希望从客户端向服务器发送 UDP 数据报,然后返回。

服务器需要为每个字节格式的数据报(表示为 char[])添加一个 header ,我一直在努力寻找相关示例。我知道如何将它作为实际文本字符发送,但我想将它发送为“有效”二进制形式(例如,如果 length40 字节 那么我想在前面加上 0x28 或 2 字节无符号等效项,而不是 ASCII char 形式或类似形式的“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 个字节 - NUL 终止符为 1 个字节)。

LSB 表示最低有效字节MSB 表示最高有效字节。这里我们把 LSB 放在第一位,然后是 MSB,这种约定称为 little endian,反之则称为 big endian。您需要确保在接收端正确解码长度。如果接收方的体系结构与发送方的字节顺序不同,则接收方的长度可能会根据代码解码错误。谷歌“字节顺序”了解更多详情。

sendbuffer 在内存中看起来像这样:

 0x0c 0x00 0x48 0x65 0x6c 0x6c ...
|   12    |'H' |'e' |'l' |'l '| ...

  //... 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]);

可能的优化:

如果您发送的大多数字符串的长度都小于 255,您可以优化而不是系统地在前面添加两个字节,但大多数时候只添加一个字节,但这是另一回事了。

关于C++/C : Prepend length to Char[] in bytes (binary/hex),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46907606/

相关文章:

C++ 函数将重复参数绑定(bind)到柯里化(Currying)函数

c - 教程中的按位运算困惑

c - 在 Qt Creator 中运行纯 C 项目

java - 在不增加位深度的情况下将 TIF 转换为 JPG

c - 为什么转换 'out of range integer to integer' 会导致 IB,但转换 'out of range floating-point to integer' 会导致 UB?

c++ - 字节数组置换 SSE 优化

c++ - 捕获 boost 序列化存档异常

c++ - Qt Scroll Area 不添加滚动条

c - 函数宏gerring : undefined reference to `Printf' collect2: error: ld returned 1 exit status

c++ - 从 int 到 char* 的看似不正确的转换 - 如何查看问题