C# byte[] 转换为 long 和反向转换

4

我想将一个给定的字节数组转换为整数。然后我想要反转这个过程,也就是说,我想要从那个整数中获得原始的字节数组。 我认为像这样的东西应该可以工作:

byte[] myBytes = { 0, 0, 0, 32 };
if (BitConverter.IsLittleEndian)
    Array.Reverse(myBytes);
int i = BitConverter.ToInt32(myBytes, 0);
Console.WriteLine("int: {0}", i); // Output: 32

byte[] newBytes = BitConverter.GetBytes(i);
Console.WriteLine("byte array: " + BitConverter.ToString(newBytes));
// Outputs: 20-00-00-00

所以它没有返回原始的字节数组。我做错了什么?
1个回答

4
您正在使用Array.Reverse反转字节,但没有明显的原因-考虑到您在使用BitConverter进行从int转换和转换to an int时,根本不需要调用Array.Reverse

如果您想将字节数组视为大端,并且面对小端BitConverter,则必须在两种情况下都反转数组,而不仅仅是一种情况。基本上,您应该将BitConverter视为提供可逆转换,但它可能不是您想要的确切转换。

如果您想为此类转换指定字节序,请使用我的MiscUtil项目中的EndianBitConverter


谢谢你的回答。 我对字节序没有兴趣,当我移除Array.reverse时,输出为00-00-00-20。原始数组是00-00-00-32,所以我仍然没有得到原始的结果。 稍后我会尝试使用你的EndianBitConverter。 - Jonathan
1
@Jonathan:不,原始数组实际上是"00-00-00-20",因为BitConverter.ToString将其格式化为十六进制,而您在数组初始化程序中使用了十进制文字。首先放置Console.WriteLine("byte array: " + BitConverter.ToString(myBytes));,您就会明白我的意思。 - Jon Skeet
是的,我现在明白了,BitConverter.ToString让我感到困惑。谢谢你的帮助! - Jonathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接