我正在C#中制作应用程序,它的字节数组包含十六进制值。
我正在以大端的方式获取数据,但我希望以小端的方式获取数据,并且正在使用Bitconverter.toInt32将值转换为整数的方法。
Bitconverter.toInt32
我的问题是,在转换值之前,我必须将这4个字节的数据从源字节数组复制到临时数组中,然后反转该临时字节数组。
我无法反转源数组,因为它还包含其他数据。
因此,我的应用程序变慢了。
在代码中,我有一个字节的源数组,waveData[]其中包含很多数据。
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);
还有其他转换方法吗?
如果您知道数据是大端的,则可以手动进行:
int value = (buffer[i++] << 24) | (buffer[i++] << 16) | (buffer[i++] << 8) | buffer[i++];
这也可以在任何CPU上可靠地工作。注意i是您当前到缓冲区的偏移量。
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)上,第二个也可能会遇到问题。