一尘不染

如何使用bitConverter.ToInt32方法从c#中的大字节序中获取小字节序数据?

c#

我正在C#中制作应用程序,它的字节数组包含十六进制值。

我正在以大端的方式获取数据,但我希望以小端的方式获取数据,并且正在使用Bitconverter.toInt32将值转换为整数的方法。

我的问题是,在转换值之前,我必须将这4个字节的数据从源字节数组复制到临时数组中,然后反转该临时字节数组。

我无法反转源数组,因为它还包含其他数据。

因此,我的应用程序变慢了。

在代码中,我有一个字节的源数组,waveData[]其中包含很多数据。

byte[] tempForTimestamp=new byte[4];
tempForTimestamp[0] = waveData[290];
tempForTimestamp[1] = waveData[289];
tempForTimestamp[2] = waveData[288];
tempForTimestamp[3] = waveData[287];
int number = BitConverter.ToInt32(tempForTimestamp, 0);

还有其他转换方法吗?


阅读 1818

收藏
2020-05-19

共1个答案

一尘不染

如果您知道数据是大端的,则可以手动进行:

int value = (buffer[i++] << 24) | (buffer[i++] << 16)
          | (buffer[i++] << 8) | buffer[i++];

这也可以在任何CPU上可靠地工作。注意i是您当前到缓冲区的偏移量。

另一种方法是改组数组:

byte tmp = buffer[i+3];
buffer[i+3] = buffer[i];
buffer[i] = tmp;
tmp = buffer[i+2];
buffer[i+2] = buffer[i+1];
buffer[i+1] = tmp;
int value = BitConverter.ToInt32(buffer, i);
i += 4;

我发现第一个更具可读性,并且没有分支/复杂的代码,因此它也应该工作得很快。在某些平台(CPU已经在运行big-endian)上,第二个也可能会遇到问题。

2020-05-19