2012-09-07 268 views
4

我有一個變量,我們稱之爲myNum,它包含一個32位值。我想把它變成一個4字節的字符串,其中字符串的每個字節對應於myNum的一部分。將整數轉換爲字符串

我試圖做類似如下(不工作):

var myNum = someFunctionReturningAnInteger(); 
var str = ""; 

str += String.charCodeFrom((myNum >>> 24) & 0xff); 
str += String.charCodeFrom((myNum >>> 16) & 0xff); 
str += String.charCodeFrom((myNum >>> 8) & 0xff); 
str += String.charCodeFrom(myNum & 0xff); 

例如,如果myNum等於350則str會是什麼樣0x000x000x010x5e當我用wireshark檢查它時。

charCodeFrom()只有當我想要每個單獨的字節的值< = 0x7f。有沒有獨立於瀏覽器的方式來做我想做的事情?

謝謝

回答

3

總之:你不能。

更長:發生這種情況的原因是字符串中值大於等於0x80的任何字符將使用瀏覽器的默認編碼(可能是UTF-8編碼爲unicode),但偶爾會發現一個瀏覽器會選擇一些內容「隨機」)。例如,如果您發送的值爲「\x80」的「字節」,您可能會在電匯上看到\xC2\x80(`「\ xC2 \ x80」.decode(「utf-8」)== u「\ u0080」)。

您可以到頁面編碼設置爲8位編碼像CP1252,這可能(在一些瀏覽器,當星星正確對齊)哄瀏覽器到使用相同的編碼時它編碼JavaScript字符串...但這不能保證跨瀏覽器兼容。

一些更可靠的選擇可能是:

  • 設置終點從JS來的字符串解碼爲Unicode,然後再對其進行編碼爲字節(在Python中,它會像"".join(chr(ord(ub)) for ub in your_unicode_string)
  • 發送「字節」作爲一個整數數組:var bytes = [ (myNum >> 24) & 0xFF, … ];
+0

問題的精彩描述。但是,一旦字符串命中Javscript,它將是UTF16,所以還有另一層翻譯問題。 –

+0

謝謝!而且,是的,內部的「字節」將使用UTF16編碼......但是,除了字符串將佔用您預期的兩倍的內存這一事實之外,我想不出任何會由此導致的問題特別是......有沒有? –

+0

只是注意到UTF8和UTF16編碼是不同的,所以八位字節序列將會不同。我經常不使用UTF16,但我確信'x80'會被編碼爲'\ x00 \ x80'(UTF16)而不是'x \ c2 \ x80'(UTF8) –