我的c#Mono代码(小端操作系统)从该在线转换器以相反的顺序返回位,我不明白为什么:
http://www.binaryconvert.com/convert_signed_char.html
所述工具将-45渲染为11010011
我的逻辑将-45表示为11001011
我可以很容易地反转位顺序,但是我不知道是否应该这样做,因为我不想束缚逻辑,我想了解为什么会这样。似乎是LSB与MSB的比较,但我不明白为什么C#(或我的OS)选择一个或另一个。 little endian与这有什么关系吗?我认为这仅与字节顺序有关,与位顺序无关。还是我错了?
为什么?这是我的逻辑:
byte? sbOut = null;
sbyte sbIn = -45;
StaticHelpers.ConvertObjectTo8BitInt(
sbIn,
out sbOut
);
BitArray baSignedByte = new BitArray(new byte[] { (byte)sbOut });
Console.WriteLine(
string.Format("sbyte {0} bits {1}", sbIn, StaticHelpers.ToBitString(baSignedByte))
);
public static class StaticHelpers
{
public static string ToBitString(this BitArray bits)
{
var sb = new StringBuilder();
for (int i = 0; i < bits.Count; i++)
{
char c = bits[i] ? '1' : '0';
sb.Append(c);
}
return sb.ToString();
}
public static void ConvertObjectTo8BitInt(
object o,
out byte? bOut
)
{
bOut = new byte();
if(o.GetType() == typeof(sbyte))
{
sbyte sbInput = (sbyte)o;
try
{
bOut = unchecked((byte)sbInput);
}
catch (Exception ex)
{
throw new Exception(
"Failed to cast Signed Byte to byte",
ex
);
}
}
else if (o.GetType() == typeof(byte))
{
try
{
bOut = (byte)o;
}
catch (Exception ex)
{
throw new Exception(
"Failed to cast Byte",
ex
);
}
}
else
{
throw new Exception(
"Failed to get sbyte or byte data type."
);
}
}
}
答案 0 :(得分:1)
请仔细阅读documentation。
数组中的第一个字节代表位0到7,第二个字节代表位8到15,依此类推。每个字节的最低有效位代表最低索引值:“字节[0]和1”代表位0,“字节[0]和2”代表位1,“字节[0]和4”代表位2,并且等等。
也就是说,您BitArray
中的位顺序是从最低有效位(LSB)到最高有效位(MSB)。它与操作系统无关。