如何使用BinaryReader正确读取16字节无符号整数

时间:2010-06-09 15:02:30

标签: c# .net vb.net binaryreader

我需要在.NET中解析二进制流以转换16字节的无符号整数。我想使用BinaryReader.ReadUIntXX()函数,但没有BinaryReader.ReadUInt128()函数可用。我假设我将不得不使用ReadByte函数滚动我自己的函数并构建一个数组,但我不知道这是否是最有效的方法? 谢谢!

3 个答案:

答案 0 :(得分:2)

我很乐意为此而感到荣幸,但是快速搜索网络,以及中提琴:

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和二进制数学)被布局时,位的顺序将决定该字段的值。一个字节是eigth位..然后有签名和无符号..但让我们坚持订单。数字1(一)可以用两种方式之一表示,10000000或00000001(详见说明中的说明) - 正如代码中的注释所示,big-endian是前面的那个,litte -endian是零的。 (请参阅http:// en.wikipedia.org/wiki/Endianness-sorry新用户,他们不会让我多次超链接....)为什么我们都不能同意?

多年前我在处理嵌入式系统时学到了这一课....记得链接? :)我表现出我的年龄吗?

答案 1 :(得分:1)

我认为来自0xA3,SLaks和Darin Dimitrov的评论回答了这个问题,但总结了一下。 在.NET中的二进制阅读器类中不支持BinaryReader.ReadUInt128(),我能找到的唯一解决方案是创建自己的函数。正如0xA3所述,.NET 4.0中有一个BigInt数据类型。我正在根据每个人的评论创建自己的功能。 谢谢!

答案 2 :(得分:-1)

一个guid正好是16个字节。

Guid guid = new Guid(byteArray);

但你不能用Guid做数学。如果需要,您可以在Internet上搜索.net的BigInteger的一些实现。然后,您可以将您的bytearray转换为BigInteger。