我需要在 .NET 中解析一个二进制流来转换一个 16 字节的无符号整数。我想使用 BinaryReader.ReadUIntXX() 函数,但没有可用的 BinaryReader.ReadUInt128() 函数。我假设我将不得不使用 ReadByte 函数滚动我自己的函数并构建一个数组,但我不知道这是否是最有效的方法?谢谢!
3 回答
我很想为此归功于这一点,但是快速搜索一下网络和中提琴:
http://msdn.microsoft.com/en-us/library/bb384066.aspx
这是代码示例(在同一页面上)
byte[] bytes = { 0, 0, 0, 25 };
// If the system architecture is little-endian (that is, little end first),
// reverse the byte array.
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
int i = BitConverter.ToInt32(bytes, 0);
Console.WriteLine("int: {0}", i);
// Output: int: 25
大多数开发人员唯一不知道的是 big-endian 和 little-endian 之间的区别。就像生活中的大多数事情一样,人类根本无法在非常简单的事情上达成一致(左右手的汽车也是一个很好的例子)。当位(记住 1 和 0 以及二进制数学)被布置时,位的顺序将决定该字段的值。一个字节是第 8 位.. 然后是有符号和无符号的.. 但让我们坚持顺序。数字 1(一)可以用以下两种方式之一表示,10000000 或 00000001(请参阅注释中的说明以获取详细说明) - 正如代码中的注释所暗示的那样,大端是前面的那个,litte -endian 是零。(参见 http://en.wikipedia.org/wiki/Endianness -对不起新用户,他们不会让我多次超链接......
多年前我在处理嵌入式系统时学到了这一课……还记得链接吗?:) 我在显示我的年龄吗?
我认为 0xA3、SLaks 和 Darin Dimitrov 的评论回答了这个问题,但将它们放在一起。.NET 中的二进制读取器类不支持 BinaryReader.ReadUInt128(),我能找到的唯一解决方案是创建自己的函数。正如 0xA3 所述,.NET 4.0 中有一个 BigInt 数据类型。我正在根据每个人的评论创建自己的功能。谢谢!
guid 的大小正好是 16 个字节。
Guid guid = new Guid(byteArray);
但是你不能用 Guid 做数学。如果需要,您可以在 Internet 上搜索 .net 的 BigInteger 的一些实现。然后,您可以将 bytearray 转换为 BigInteger。