【发布时间】:2025-12-31 23:20:04
【问题描述】:
假设:
转换一个 byte[] 从小端到大 Endian 意味着反转位的顺序 byte[] 的每个字节。
假设这是正确的,我尝试了以下方法来理解这一点:
byte[] data = new byte[] { 1, 2, 3, 4, 5, 15, 24 };
byte[] inverted = ToBig(data);
var little = new BitArray(data);
var big = new BitArray(inverted);
int i = 1;
foreach (bool b in little)
{
Console.Write(b ? "1" : "0");
if (i == 8)
{
i = 0;
Console.Write(" ");
}
i++;
}
Console.WriteLine();
i = 1;
foreach (bool b in big)
{
Console.Write(b ? "1" : "0");
if (i == 8)
{
i = 0;
Console.Write(" ");
}
i++;
}
Console.WriteLine();
Console.WriteLine(BitConverter.ToString(data));
Console.WriteLine(BitConverter.ToString(ToBig(data)));
foreach (byte b in data)
{
Console.Write("{0} ", b);
}
Console.WriteLine();
foreach (byte b in inverted)
{
Console.Write("{0} ", b);
}
转换方法:
private static byte[] ToBig(byte[] data)
{
byte[] inverted = new byte[data.Length];
for (int i = 0; i < data.Length; i++)
{
var bits = new BitArray(new byte[] { data[i] });
var invertedBits = new BitArray(bits.Count);
int x = 0;
for (int p = bits.Count - 1; p >= 0; p--)
{
invertedBits[x] = bits[p];
x++;
}
invertedBits.CopyTo(inverted, i);
}
return inverted;
}
这个小应用程序的输出与我的预期不同:
00000001 00000010 00000011 00000100 00000101 00001111 00011000
00000001 00000010 00000011 00000100 00000101 00001111 00011000
80-40-C0-20-A0-F0-18
01-02-03-04-05-0F-18
1 2 3 4 5 15 24
1 2 3 4 5 15 24
由于某种原因,数据保持不变,除非使用 BitConverter 打印。
我不明白什么?
更新
新代码产生以下输出:
10000000 01000000 11000000 00100000 10100000 11110000 00011000
00000001 00000010 00000011 00000100 00000101 00001111 00011000
01-02-03-04-05-0F-18
80-40-C0-20-A0-F0-18
1 2 3 4 5 15 24
128 64 192 32 160 240 24
但是正如我现在被告知的那样,无论如何我的方法都不正确,因为我应该反转字节 而不是位?
与我合作的这位硬件开发人员告诉我反转位,因为他无法读取数据。
我使用它的上下文
将使用它的应用程序并不能真正使用数字。
我应该将比特流保存到文件中
1 = 白色,0 = 黑色。
它们代表 256x64 位图的像素。
byte 0 到 byte 31 代表第一行像素 byte 32 到 byte 63 第二行像素。
我有输出这些位的代码...但开发人员告诉 我他们的顺序错误......他说字节很好,但位不是。
所以我很困惑:p
【问题讨论】:
-
仅供参考,字节序是指单词中字节的顺序,而不是字节中的位。
标签: c# .net endianness