2011-12-29 75 views
1

我有把一個字節數組轉換成一個整數C#轉換字節數組爲int總是相同數量

public int Encode(string input) 
{ 
    var bytes = Encoding.Unicode.GetBytes(input.ToLowerInvariant()); 
    return BitConverter.ToInt64(bytes,0); 
} 

爲什麼此整數不對任何輸入字符串不同的方法?

例如

input = "http://www.google.com => 31525695615402088

input = "http://www.microsoft.com => 31525695615402088

+7

? – rene 2011-12-29 22:50:41

+3

你究竟想要完成什麼? – 2011-12-29 22:54:07

回答

6

因爲64位是8個字節,所以ToInt64只消耗輸入數組的前8個字節。你使用的字符串的前八個字節是什麼?

而且,正如alexm所指出的,Encoding.Unicode指定了UTF-16,其中每個字符實際上是兩個字節(usually),因此只有前4個字符數。

+1

另外值得一提的是,一個Unicode字符需要兩個字節。 – alexm 2011-12-29 22:53:13

+0

@alexm:好點;答案修正! – 2011-12-29 22:57:05

+0

還值得注意的是,前四個字符是「http」! – phoog 2011-12-29 23:24:40

2

一個Int64是8個字節。我相信你可以從那裏弄清楚。

2

發生這種情況的原因是64位整數使用8字節的內存,並且BitConverter只會使用指定的字節數組的前8個字節進行轉換,從位置0開始。您提供的每個樣本輸入始於相同8個字節。

值得一提的是,不可能將一個可變長度字符串的無損編碼轉換成一個大小爲4〜8字節的整型數據類型。您可能正在尋找一個哈希算法,它表示您的數據在有限的字節數。

0

那麼,ToInt64使用8個字節 - 這是4個unicode字符。

0

由於BitConverter.ToInt64只取得字節數組的前8個字節,這些字節對您的字符串而言是相同的。嘗試輸入字符串「google.com」和「yahoo.com」。

3
'h' == 0x68 
't' == 0x74 
'p' == 0x70 

小尾數,兩個字節的字符,所以「HTTP」爲您提供了開頭的數組:

{ 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00 ... 

將此解釋爲小端的32位整數,你會得到:

0x0070007400740068 

其中,因爲前8個字節是相同的,當然是等於31525695615402088