C++/C:Char[]的前缀长度(以字节为单位)(二进制/十六进制)
C++/C: Prepend length to Char[] in bytes (binary/hex)
我希望从客户端向服务器发送UDP数据报,然后再发送回来。
服务器需要以字节格式为每个数据报(表示为char[]
)添加一个报头,我一直在努力寻找这样的例子。我知道如何将其作为实际文本字符发送,但我想将其作为"有效"的二进制形式发送(例如,如果length
是40 bytes
,那么我希望在0x28
或2字节的无符号等价物之前加上前缀,而不是ASCIIchar
或类似形式的"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放在第二位,这个约定被称为小端序,另一种方法是大端序。您需要确保在接收器端,长度被正确解码。如果接收器侧的架构具有与发送器不同的其他端序,则接收器侧的长度可能根据代码而被解码错误。谷歌"endianness"了解更多详细信息。
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++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 获取嵌套 stl 容器的大小(以字节为单位)
- 常量"C"占用的空间(以字节为单位)
- C++ 中 STL 中迭代器的大小(以字节为单位)是多少
- 有人知道可以使用 c++ 以字节为单位编码 asm 字符串的任何东西吗?
- 如何以字节为单位计算mpz_class的长度?
- 获取C++模板参数包的总大小(以字节为单位)
- C++/C:Char[]的前缀长度(以字节为单位)(二进制/十六进制)
- visual 在指向缓冲区(字符串 " ")的空指针上使用 sizeof() C++ 以获得以字节为单位的大小?
- 如何获得以字节为单位的UTF-16LE字符串的大小
- 为什么 C/C++ "Hello World" 以千字节为单位?
- C++字符串长度(以字节为单位)
- 解码像 FAST 这样的数据协议的快速方法是什么,其中数据以字节为单位编码,并将位作为存在标志
- 解压缩加密文件(以字节为单位)
- 在 boost::multi_array 中以字节为单位表示步幅
- 省略号函数参数的大小(以字节为单位)
- C++获取EOL的大小(以字节为单位)
- 在openMPI中向进程发送数据(以字节为单位)的最佳方式
- 获取矢量的大小(以字节为单位)
- 如何将数组限制在特定的大小(以千字节为单位)