2012-12-18 10 views
0

我分配了一個故意大於BitConverter.GetBytes結果的數組。我的目標是保留最後一個字節爲空,這樣我就可以防止這個數字被視爲兩個人的恭維並且有tempPosBytes2當我運行BitConverter.GetBytes時,我的數組tempPosBytes2似乎縮小了。爲什麼BitConverter縮小我已經分配的數組? (我試圖防止補碼問題)

uint positiveNumber = 4293967296; 
byte[] tempPosBytes2 = new byte[tempPosBytes.Length + 1]; // four bytes plus one 
tempPosBytes2 = BitConverter.GetBytes(positiveNumber); // tempPositiveBytes2 is now 4 bytes!! 

問題

什麼在幕後事情,我怎麼能離開尾隨字節而不復制的陣列?

我需要這與BigInteger的(字節[]),如以下工作:

BigInteger positiveBigIntBAD2 = new BigInteger(tempPosBytes2); // Invalid 

回答

3

你的陣列不被縮水,你有內部BitConverter.GetBytes分配一個全新的陣列。

當然,您可以將輸出數據複製到您選擇的大小的數組中。

或者,只需製作您自己的版本BitConverter。這很簡單:

byte[] tempPosBytes2 = new byte[] { (byte)(positiveNumber), 
            (byte)(positiveNumber >> 8), 
            (byte)(positiveNumber >> 16), 
            (byte)(positiveNumber >> 24), 
            0 }; 

我建議你比較兩種技術的性能。

順便說一句,您可以使用BigInteger構造函數,它需要uint

1

BitConverter.GetBytes不使用陣列,它不能因爲你在通過了它。

而是正在發生的事情是要創建一個數組,然後立即摧毀它。

如果您需要GetBytes的結果在您的數組中,您可以查看是否有重載或其他方法接受數組寫入或自己複製內容。

2

它不會縮小任何東西。 GetBytes總是分配一個新數組,並且您的分配會覆蓋對現有字節數組的引用。

如果您需要最高字節始終爲零,以便BigInteger不會將其解釋爲負數,那麼您可以在GetBytes之後執行Array.Resize以將大小增加1,並且新字節將具有值零,就像你想要的。

BigInteger constructor頁面上有一個關於這個事情的例子,它提供了一個例子,它將在必要時調整數組的大小。你可以自己寫一個幫手方法CreateUnsignedBigInteger(byte[])這會做那件事情。

public BigInteger CreateUnsignedBigInteger(byte[] bytes) 
{ 
    if ((bytes[bytes.Length - 1] & 0x80) > 0) 
    { 
     byte[] old = bytes; 
     bytes = new byte[old.Length + 1]; 
     Array.Copy(old, bytes, old.Length); 
    } 

    return new BigInteger(bytes); 
} 
+0

我想到了一個調整大小的,但是這是一個O(n)操作,其中n是數組的大小 – LamonteCristo

+0

@ makerofthings7:那麼你在這個數組上做的所有其他操作都是如此。 * n *很小。 –

+0

是的,它是O(n),但'n'是四。我們知道它是四個,因爲你正在處理32位整數。 –

1

諷刺的是,如果你想有一個byte[]可以傳遞到BigInteger構造給予價值相當於您uint,你可以做

byte[] tempPosBytes = new BigInteger(positiveNumber).ToByteArray(); 
相關問題