从C中的字符串读取char代码的数组<uint16array>

时间:2017-02-21 11:03:36

标签: c typed-arrays

我将JavaScript字符串写为二进制文件,将字符串的每个字符转换为Uint16Array(2bytes),如下所示:

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);
}

当我尝试使用int时,它说:

117468416
117468928
117466112
117466368
117469696
117468672
117465344
117470208
117468928
117469696

据我所知,short int是2字节长度,所以理论上看起来很好,但为什么我得到那些大数字呢?

我在电脑上试过了,

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

它说2。

我不擅长C,所以实际上很难找出问题所在。

任何建议都会非常感激。谢谢!

1 个答案:

答案 0 :(得分:0)

感谢您的评论。我解决了将8位向右移动的问题,因为JavaScript的DataView将二进制文件视为默认的小端。

char name[100] = "";

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