首先,我认为这个问题不是C#独立的。但也可以用于其他语言,如C。
我现在正在尝试解析以4字节little-endian格式存储整数的文件格式。 TBH,我不知道little-endian格式和big-endian格式是如何工作的。
但我需要将它们转换为可用的int变量。
例如, 02 00 00 00 = 2
到目前为止,我有这个代码来转换前2个字节:(我使用FileStream.Read将原始数据存储到缓冲区变量中)
int num = ((buffer[5] << 8) + buffer[4]);
但它只会转换前两个字节。 (示例中为02 00,而非02 00 00 00)
任何形式的帮助将不胜感激:)
答案 0 :(得分:16)
int GetBigEndianIntegerFromByteArray(byte[] data, int startIndex) {
return (data[startIndex] << 24)
| (data[startIndex + 1] << 16)
| (data[startIndex + 2] << 8)
| data[startIndex + 3];
}
int GetLittleEndianIntegerFromByteArray(byte[] data, int startIndex) {
return (data[startIndex + 3] << 24)
| (data[startIndex + 2] << 16)
| (data[startIndex + 1] << 8)
| data[startIndex];
}
答案 1 :(得分:4)
使用内置方法:
byte[] data = { 2, 0, 0, 0 };
Array.Reverse(data);
int value = BitConverter.ToInt32(data, 0);
另一方面,使用优化的不安全代码:
public static unsafe void SwapInts(int[] data) {
int cnt = data.Length;
fixed (int* d = data) {
byte* p = (byte*)d;
while (cnt-- > 0) {
byte a = *p;
p++;
byte b = *p;
*p = *(p + 1);
p++;
*p = b;
p++;
*(p - 3) = *p;
*p = a;
p++;
}
}
}
注意:您可以使用BitConverter.IsLittleEndian
检查计算机是否在内部使用小端或大端,以便您可以使代码可移植。
答案 2 :(得分:2)
答案 3 :(得分:0)
我从小端到int的通用解决方案就是:
public static int GetLittleEndianIntegerFromByteArray(byte[] data)
{
int length = data.Length;
int result = 0;
for (int i = length - 1; i >= 0; i--)
{
result |= data[i] << i * 8;
}
return result;
}