2014-09-20 18 views
1

運行此代碼後:編寫然後從文件讀取回TypeBuffer到/給出了意想不到的效果

var arr = new Uint32Array(16); 
for (var i=0; i<16; ++i) arr[i] = i; 
fs.writeFileSync("arr",new Uint8Array(arr).buffer); 
console.log([].slice.call(new Uint32Array(fs.readFileSync("arr")))); 

的預期結果是:

[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ] 

但是,相反,它會產生這樣的輸出:

[ 91, 111, 98, 106, 101, 99, 116, 32, 65, 114, 114, 97, 121, 66, 117, 102, 102, 101, 114, 93 ] 

arr文件的hexdump都顯示了這一點:

0000000 5b 6f 62 6a 65 63 74 20 41 72 72 61 79 42 75 66 
0000010 66 65 72 5d          

爲什麼生產的產量不符合預期產量?

+2

您是如何解決此問題的?你是否觀察過新的「arr」文件的內容?這應該給你一個很大的線索。 – 2014-09-20 03:27:49

+2

此問題未完整指定。你在觀察什麼是「別的東西」?不要期望人們必須運行你的代碼來回答你的問題。有些人只是意識到,本網站上的許多有經驗的海報只是通過閱讀這個問題來回答(請注意,很多高級代表用戶回答「此代碼未經過測試」desclaimers) – slebetman 2014-09-20 03:47:50

+0

@Mike這是一個非常好的編輯,謝謝。 – MaiaVictor 2014-09-20 18:20:04

回答

1

(在這種情況下Uint8Array)一個TypedArraybuffer propertyArrayBuffer,這是不一樣的一個node.js Buffer。如果您嘗試在fs模塊預計有node.js Buffer時嘗試將ArrayBuffer讀取/寫入文件,則不起作用。

但是,您可以convert between the two any number of ways。你的代碼最簡單的變化,使其按預期工作是簡單地初始化從arr一個Buffer而不是試圖使用.buffer屬性:

var arr = new Uint32Array(16); 
for (var i=0; i<16; ++i) arr[i] = i; 
fs.writeFileSync("arr", new Buffer(arr)); // <-- HERE 
console.log([].slice.call(new Uint32Array(fs.readFileSync("arr")))); 

輸出:

[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ] 

。爲更完整,arr文件的十六進制轉儲文件如下所示:

0000000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 
+0

我從來沒有猜到過。我一直認爲'node.js'緩衝區和ArrayBuffers是相同的。非常感謝你。 – MaiaVictor 2014-09-20 18:21:42

相關問題