я написал строку 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, так что на самом деле это довольно трудно выяснить, в чем проблема.
Любой совет очень понравится. Спасибо!
27904 шестнадцатеричное 0x6d00 и десятичная версия 0x6d является 109. – unwind
Java эксперты, не распинают меня за вопрос это: Вы не ява многобайтовыми скаляры [большой обратный порядок байт] (HTTP://stackoverflow.com/questions/362384/are-integers-in-java-little-endian-or-big-endian)? что, кажется, там, где это происходит. У вас есть BE-short, загружаемый во что-то, что использует LE. – WhozCraig
@WhozCraig Вы имели в виду JavaScript, не так ли? – unwind