2015-04-06 113 views
0

我有一個問題,我無法整天解決。我是C#的新手,我要求你幫我一把。結合兩個ulong值並將其轉換爲字節數組

我有兩個ulong值。我需要組合它們的二進制表示並獲得16個字節的值。我知道C#不支持128位類型。但我也不需要在變量中保存這個值。我需要將此值轉換爲字節數組。 我試圖值這樣的組合:

long a = ((long)b << 64) + (long)c; 

和轉換後BitConverter到字節數組。

但我意識到這是不正確的,因爲長值的大小是8個字節。 我不想創建一個128類型來獲得結果。

那麼有沒有辦法結合並直接添加到字節數組?

感謝

+0

'BitConverter'可以從偏移量的字節數組中讀取,但不幸的是沒有任何函數可以寫入字節數組中的偏移量:( – 2015-04-06 05:57:21

回答

0

如果我運行此:

var x = (ulong)1; 
var y = (ulong)2; 

var result = 
    BitConverter.GetBytes(x) 
     .Concat(BitConverter.GetBytes(y)) 
     .ToArray(); 

我得到這個:

result

這是你想要的嗎?

2

Microsoft C#支持使用BigInteger任意長度的整數。你可以結合你的兩個值,如例子中你給,就像這樣:

BigInteger a = b; 
a <<= 64; 
a += c; 

然而,當你indiciated你並不需要保存這個值。在你提到之前,是的,我知道排序。有機器依賴的排序和線上排序。我們不應該試圖產生任何依賴機器的排序......我們可以用我最熟悉的語言產生線上排序的方式是使用右移和模運算符,至少對於未簽名的類型。簽名類型介紹了編碼標誌的複雜性,但這裏有一個例子,我認爲你可能受益於:

byte[] array = { (byte)(b >> 56), (byte)(b >> 48), (byte)(b >> 40), (byte)(b >> 32), 
       (byte)(b >> 24), (byte)(b >> 16), (byte)(b >> 8), (byte)(b  ), 
       (byte)(c >> 56), (byte)(c >> 48), (byte)(c >> 40), (byte)(c >> 32), 
       (byte)(c >> 24), (byte)(c >> 16), (byte)(c >> 8), (byte)(c  ) }; 
+0

好點,我現在會進行更正 – Sebivor 2015-04-06 06:38:01

+0

似乎它是我需要什麼......謝謝,但是你知道如何在pl sql中得到相同的結果嗎?我需要比較結果。 – stilhead 2015-04-06 08:15:40

+0

很好,我打算表達我對代碼缺乏完全信心。 ,@BenVoigt。你有什麼建議嗎? – Sebivor 2015-04-06 23:28:59

0

我猜它的功課? 您可以表示您的術語,ulongs a和b爲字節數組。 之後,您可以爲總和創建一個新的字節數組c。 對於每一個字節都是逐位進位,只是做一個正常的二進制補碼二進制加法,記住從字節到字節的進位位。 如果最後一個字節有進位,那麼你應該拋出某種類型的「ulong addition overflow exception」。

相關問題