我正在处理一些C源代码我尝试转换为Javascript,我在这一行遇到了障碍
char ddata[512];
*(unsigned int*)(ddata+0)=123;
*(unsigned int*)(ddata+4)=add-8;
memset(ddata+8,0,add-8);
我不确定这里到底发生了什么,我知道他们正在将char转换为unsigned int,但是ddata+0
和这里做的是什么?感谢。
答案 0 :(得分:2)
你不能说。
这是因为将char*
转换为unsigned*
时的行为未定义 ,除非指针开始为unsigned*
,在你的情况下,它没有。
ddata + 0
相当于ddata
。
ddata + 4
相当于&ddata[4]
,即数组第5个元素的地址。
对于它的价值,看起来C程序员试图将几个unsigned
文字序列化为字节数组。但是代码很乱;除了我已经说过的,他们似乎假设unsigned
占用4个字节,但情况不一定如此。
答案 1 :(得分:0)
代码片段在123
缓冲区char
的前4个字节中将记录ID(ddata
)存储为4字节整数。然后,它在以下4个字节中存储长度(add-8
),最后将以下add-8
个字节初始化为0
。
将此翻译为javascript可以通过不同的方式完成,但可能不是通过构造具有相同内容的字符串。原因是字符串在javascript中不是字节缓冲区,它们包含unicode代码点,因此将字符串写入存储可能会执行一些不需要的转换。
最佳解决方案取决于您的实际目标平台,其中字节数组可用于更接近地匹配C代码的预期语义。
请注意,上述代码不可移植,并且由于各种原因而具有未定义的行为,特别是因为ddata
可能未正确对齐以用作通过强制转换unsigned int
存储的地址*(unsigned int*)ddata = 123;
1}},因为它假定int
为4个字节,因为它依赖于未指定的字节顺序。
在Redhat linux机器上,它可能按预期工作,并且相同的C代码可能在MacOS上正确执行,它使用相同的英特尔架构,只需很少的字节顺序。如何最好地将其转换为Javascript需要更多的上下文和规范。
与此同时,代码最好以这种方式重写:
unsigned char ddata[512];
if (add <= 512) {
ddata[0] = 123;
ddata[1] = 0;
ddata[2] = 0;
ddata[3] = 0;
ddata[4] = ((add-8) >> 0) & 255;
ddata[5] = ((add-8) >> 8) & 255;
ddata[6] = ((add-8) >> 16) & 255;
ddata[7] = ((add-8) >> 24) & 255;
memset(ddata + 8, 0, add - 8);
}