8字节数组返回长(C#到C++)

本文关键字:C++ 字节 字节数 数组 返回 | 更新日期: 2023-09-27 18:24:45

我正在用C#将一个长字节数组转换为一个8槽字节数组

Byte[] Data = BitConverter.GetBytes(data.LongLength);

例如,如果data.LongLenght是172085,我得到以下数组{53160,2,0,0,0}但是在我把这个发送到我的c++服务器之后,我想再次把它发送到一个long。

我试过了,但没有成功。。。

long fileLenght = 0;
for( int i=0;i < 8; ++i)
    fileLenght = (fileLenght << 8) + Data[i];

8字节数组返回长(C#到C++)

无论何时通过网络发送数据,都必须注意endianness

在您的情况下,从字节数组中重新创建long的正确方法似乎是从右到左重新构建它:

long fileLength = 0;
for( int i=7; i >= 0; i--)
    fileLength = (fileLength << 8) + Data[i];

但情况并非总是如此。根据端点的硬件和操作系统,以及您使用的网络传输协议,您可能会有大端序或小端序格式的数据,而接收端可能是小端序或大端序。

来自文档:

GetBytes方法返回的数组中字节的顺序取决于计算机体系结构是小端序还是大端序。

在您的硬件上,数组似乎是先用其最低有效字节发送的。因此,您应该从数组的末尾开始循环:

int64_t fileLenth = 0;
for( int i=7;i >= 0; --i)
    fileLenght = (fileLenght << 8) + Data[i];

演示。(打印172085)

为了更好地与C#兼容,您应该使用独立于系统的64位整数类型,而不是long,即int64_t

如果两端的字节顺序相同(C#总是小端序,可能您的C++也是):

long long fileLength;
memcpy(&fileLength, Data, 8);

优化编译器几乎肯定会把它变成一个64位的移动,所以不要担心它看起来像是一个昂贵的函数调用。