1

我正在使用 C# 将 long 转换为 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];
4

3 回答 3

1

文档中:

GetBytes 方法返回的数组中的字节顺序取决于计算机体系结构是 little-endian 还是 big-endian。

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

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

演示。(打印 172085)

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

于 2014-09-26T19:12:15.810 回答
1

每当您通过网络发送数据时,您都必须注意字节顺序

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

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

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

于 2014-09-26T19:12:27.937 回答
0

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

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

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

于 2014-09-26T19:30:48.643 回答