在Javascript中是否有等效的C' s *(unsigned int *)(char)= 123?

时间:2016-02-23 08:53:03

标签: javascript c

我正在处理一些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和这里做的是什么?感谢。

2 个答案:

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