2017-02-21 71 views
0

我寫JavaScript字符串爲二進制,要Uint16Array字符串的每個字符轉換(2字節)是這樣的:讀陣列<Uint16Array>從字符串用C

for(let i = 0; i < name.length; i++) { 
    dv.setUint16(i * 2, name.charCodeAt(i)); 
} 

我檢查了文件大小,字節數是正確的,但是當我看到從C字符串,它打印意外的數字:

27904 
28416 
25600 
25856 
29184 
28160 
24832 
29696 
28416 
29184 

從JavaScript閱讀,是這樣的,如我所料:

109 
111 
100 
101 
114 
110 
97 
116 
111 
114 

這是C,從文件中讀取字符串的代碼:

// Read name 
for(int i = 0; i < nameLen; i++) { 
    short int c; 
    fread(&c, 2, 1, fp); 
    printf("%d\n", c); 
} 

而且它的讀取字符串的JavaScript代碼:

for(let i = 0; i < nameLen; i++) { 
    let char = dv.getUint16(i * 2); // Each of character has 2 bytes 
    console.log(char); 
} 

此外,當我與詮釋試過,甾體抗炎藥:

117468416 
117468928 
117466112 
117466368 
117469696 
117468672 
117465344 
117470208 
117468928 
117469696 

據我所知,short int是2個字節的長度,所以在理論上看起來很好,但爲什麼我得到那些大數?

我想這在我的電腦上,

printf("%d\n", sizeof(short int)); 

它甾體抗炎藥2.

我不擅長C,所以實際上這是很難找到了什麼問題。

任何建議將非常感激。謝謝!

+1

27904是十六進制0x6d00,和0x6d的十進制版本是109 – unwind

+1

Java的專家,不要釘死我要問這個:不是Java多字節標量[大端(HTTP:/ /stackoverflow.com/questions/362384/are-integers-in-java-little-endian-or-big-endian)?這似乎是這裏的標題。你有一個BE-短被加載到使用LE的東西。 – WhozCraig

+2

@WhozCraig你的意思是JavaScript,對吧? – unwind

回答

0

謝謝您的意見。我解決了將8位向右移位的問題,因爲JavaScript的DataView將二進制文件編寫爲默認的小端文件。

char name[100] = ""; 

for(int i = 0; i < nameLen; i++) { 
    short int c; 
    fread(&c, 2, 1, fp); 
    c >>= 8; 
}