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

时间:2014-09-26 19:09:09

标签: c# c++ bitconverter

我正在使用C#

将长到8字节的字节数组转换

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

例如,如果data.LongLenght是172085,我会得到以下数组{53,160,2,0,0,0,0,0} 但是在我将它发送到我的c ++服务器后,我想再次使用它。

我试过这个但没有成功......

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

3 个答案:

答案 0 :(得分:1)

来自documentation

  

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

在您的硬件上看起来,数组首先以最低有效字节发送。因此,您应该从数组的末尾开始循环:

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

Demo.(打印172085)

为了更好地与C#兼容,您应使用system-independent 64-bit integral type代替long,即int64_t

答案 1 :(得分:1)

每当您通过网络发送数据时,您必须注意endianness

在你的情况下,看起来从字节数组重新创建long的正确方法是从右到左重建它:

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

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

答案 2 :(得分:0)

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

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

优化编译器几乎肯定会将其转换为单个64位移动,因此不要担心它看起来像是一个昂贵的函数调用。