2010-06-09 49 views
3

我需要解析.NET中的二進制流來轉換16字節的無符號整數。我想使用BinaryReader.ReadUIntXX()函數,但沒有可用的BinaryReader.ReadUInt128()函數。我假設我將不得不使用ReadByte函數來滾動我自己的函數並構建一個數組,但我不知道這是否是最有效的方法? 謝謝!如何使用BinaryReader正確讀取16字節的無符號整數

+1

.Net沒有'UInt128'類型。你想用整數做什麼? – SLaks 2010-06-09 15:08:32

+3

你在談論這個UInt128數據類型:http://msdn.microsoft.com/en-us/library/cc230384%28PROT.10%29.aspx或BigInteger(http://msdn.microsoft.com/en -us/library/system.numerics.biginteger.aspx)與.NET 4.0引入的結構? – 2010-06-09 15:09:35

+1

從流中讀取16個字節並將它們存儲到數組中不會成爲問題。將它們轉換爲整數將是因爲在.NET中沒有這種整數類型能夠表示128位整數。因此,您必須自行推出或使用.NET 4.0中的BigInteger(http://msdn.microsoft.com/zh-cn/library/dd268207(v=VS.100).aspx)。 – 2010-06-09 15:10:24

回答

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 

大多數開發人員不知道的唯一問題是大端和小端之間的區別。就像生活中的大多數事情一樣,人類根本無法就非常簡單的事情達成共識(左右手汽車也是一個很好的例子)。當位(記住1和0以及二進制數學)被排列時,位的順序將決定字段的值。一個字節是第三位..然後是有符號和無符號..但讓我們堅持下單。數字1(一)可以用兩種方式中的一種表示,即10000000或00000001(詳細解釋見註釋中的說明) - 正如代碼中的評論所暗示的那樣,大寫字母是前面的那個,litte - 印度是一個零。 (請參閱http:// en.wikipedia.org/wiki/Endianness -sorry新用戶,他們不會讓我超鏈接多次....)爲什麼我們不能只是同意?

很多年前,我在處理嵌入式系統時學到了這一課。 :)我是否顯示我的年齡?

+1

由於問題要求128位值,因此這很可能不起作用。但是我們無法確定,因爲沒有給出足夠的細節。 – 2010-06-09 15:19:46

+0

同意@ 0xA3。 OP要求存儲128位無符號整數。 – 2010-06-09 15:27:15

+2

其實你是錯在Endianness在Big Endian的16位系統中代表1是00000000 00000001,在Little Endian是00000001 00000000而不是10000000 00000000 – 2010-06-09 15:31:18

-1

guid的大小正好是16個字節。

Guid guid = new Guid(byteArray);

但你不能用Guid做數學。如果需要,您可以在Internet上搜索一些BigInteger for .net的實現。然後,您可以將您的bytearray轉換爲BigInteger。

1

我認爲來自0xA3,SLaks和Darin Dimitrov的評論回答了這個問題,但把它放在一起。 .NET中的二進制閱讀器類不支持BinaryReader.ReadUInt128(),我可以找到的唯一解決方案是創建我自己的函數。正如0xA3提到的,.NET 4.0中有一個BigInt數據類型。我正在根據每個人的意見創建自己的功能。 謝謝!

相關問題