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

Is there an equivalent to C's *(unsigned int*)(char) = 123 in Javascript?

本文关键字:unsigned int char 是否 Javascript      更新时间:2023-09-26

我正在处理一些我试图转换为Javascript的C源代码,我在这条线上遇到了障碍

char ddata[512];
*(unsigned int*)(ddata+0)=123;
*(unsigned int*)(ddata+4)=add-8;
memset(ddata+8,0,add-8);

我不确定这里到底发生了什么,我知道他们正在将字符转换为未签名的 int,但是ddata+0和东西在这里做什么?谢谢。

你不能说。

这是因为将char*投射到unsigned*的行为是未定义的除非指针以unsigned*开始,而在您的情况下并非如此。

ddata + 0相当于ddata

ddata + 4等价于&ddata[4],即数组第5个元素的地址。

就其价值而言,看起来 C 程序员正在尝试将几个unsigned文字序列化为一个字节数组。但是代码一团糟;除了我已经说过的之外,他们似乎假设一个unsigned占用 4 个字节,但事实并非如此。

代码片段将记录 ID (123) 存储为 4 字节整数,位于char缓冲区ddata的前 4 个字节中。然后它在接下来的4个字节中存储一个长度(add-8),最后将下面的add-8个字节初始化为0

将其

转换为javascript可以通过不同的方式完成,但可能不会通过构造具有相同内容的字符串来完成。 原因是字符串不是javascript中的字节缓冲区,它们包含Unicode代码点,因此将字符串写入存储可能会执行一些不需要的转换。

最佳解决方案取决于您的实际目标平台,其中字节数组可用于更紧密地匹配 C 代码的预期语义。

请注意,上面的代码是不可移植的,并且由于各种原因具有未定义的行为,特别是因为ddata可能无法正确对齐以用作通过强制*(unsigned int*)ddata = 123;存储unsigned int的地址,因为它假定int是 4 个字节,并且因为它依赖于未指定的字节排序。

Redhat linux盒子上,它可能按预期工作,并且相同的C代码可能会在MacOS上正确执行,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);
}