如何在 C++ 中从 UDP 中解压缩无符号字符字节数组

How to unpack unsigned char byte array from UDP in C++

提问人:DWil 提问时间:1/22/2019 最后编辑:Jarod42DWil 更新时间:1/22/2019 访问量:721

问:

我正在用 C++ 创建一个 UDP 发送方/接收方应用程序。我成功地通过 UDP 打包和发送数据包,并通过 UDP 成功接收相同的数据包,但是当我尝试将数据包解压缩到字节数组中时,问题出现了。我收到大小为 51 的字节数组,没有任何问题。然后,我将其转换为 a,并尝试根据数据包结构中的可变大小创建新的向量。std::vector<unsigned char>

数据包结构如下,长度为 51 字节:

uint16 data1;
double data2;
double data3;
double data4;
double data5;
double data6;
double data7;
uint8 data8;

我在一个名为 receiveArray 的函数中创建缓冲区,该函数返回一个:std::vector<unsigned char>

int BUFFSIZE = 51;
unsigned char buf[BUFFSIZE];

我收到数据包时没有错误。然后,我使用以下代码创建一个向量并返回该向量:buf

std::vector<unsigned char> output(buf, buf + BUFFSIZE);
return output;

我调用该函数并将其放入一个名为的向量中,该向量也显示正确的向量大小 51。receiveArraybuf

std::vector<unsigned char> buf = receiver.receiveArray();

然后,我尝试按索引拆分向量,并使用 memcpy 将向量转换为正确的值。

std::vector<unsigned char> data1Vector(buf.begin(), buf.begin()+1);
std::vector<unsigned char> data2Vector(buf.begin()+2, buf.begin()+9);
std::vector<unsigned char> data3Vector(buf.begin()+10, buf.begin()+17);
double data1, data2, data3;
memcpy(&data1, &data1Vector, sizeof(uint16_t));
memcpy(&data2, &data2Vector, sizeof(double));
memcpy(&data3, &data3Vector, sizeof(double));

显然这是行不通的,我不知道我做错了什么。我有一段非常相似的代码,用 python 编写,可以正确解码数据包,所以我认为这不是我的数据包结构或打包。这是我的实现。我也不使用任何序列化协议。

我对C++很陌生,可能犯了一些可怕的错误。感谢您的帮助,我非常感谢。

C++ 数组矢 UDP 字节

评论

2赞 tkausl 1/22/2019
您看到的是向量内部结构,而不是它包含的数据。memcpy
0赞 DWil 1/22/2019
我需要@tkausl &data1Vector.data()?
1赞 Jarod42 1/22/2019
int BUFFSIZE = 51;unsigned char buf[BUFFSIZE];缺少,否则使用无效 C++ 的 VLA 扩展。const
1赞 Jarod42 1/22/2019
顺便说一句,如果你已经有一个缓冲区,你不需要使用中间体来做.std::vectormemcpy
1赞 Jarod42 1/22/2019
顺便说一句,有了,你不处理 endianess。并且不确定这是否保证了二进制表示。memcpydouble

答: 暂无答案