2017-02-21 12 views
0

я написал строку JavaScript в двоичной форме, которая преобразует каждый символ строки в Uint16Array (2bytes), как это:Чтение массива <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 

Как я знаю, короткий int составляет 2 байта, поэтому теоретически выглядит так, как будто все в порядке, но почему я получил эти большие числа?

Я попробовал это на моем компьютере,

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

И Саидов 2.

Я не очень хорошо на C, так что на самом деле это довольно трудно выяснить, в чем проблема.

Любой совет очень понравится. Спасибо!

+1

27904 шестнадцатеричное 0x6d00 и десятичная версия 0x6d является 109. – unwind

+1

Java эксперты, не распинают меня за вопрос это: Вы не ява многобайтовыми скаляры [большой обратный порядок байт] (HTTP://stackoverflow.com/questions/362384/are-integers-in-java-little-endian-or-big-endian)? что, кажется, там, где это происходит. У вас есть BE-short, загружаемый во что-то, что использует LE. – WhozCraig

+2

@WhozCraig Вы имели в виду JavaScript, не так ли? – unwind

ответ

0

Благодарим вас за комментарии. Я решил сместив 8 бит вправо, потому что DataView JavaScript записывает двоичный файл как little-endian по умолчанию.

char name[100] = ""; 

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