在Javascript中是否有等效于C的*(unsigned int*)(char)= 123
Is there an equivalent to C's *(unsigned int*)(char) = 123 in Javascript?
我正在处理一些我试图转换为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);
}
- 按从高到低对多个int变量进行排序
- 如何在Javascript中读取unsigned int
- 如何将Date字段设置为等于另一个Date+Int值,该值表示月份值
- 从int值来看,Javascript日期不正确
- JavaScript警报适用于int,但不适用于string
- 如何从二进制int中获取百分比,每个位表示x%
- Chart.js:将对象而不是int值作为数据传递
- 如何在javascript中将Integer转换为int
- 为什么不'将字符串转换为int不正确(parseInt)
- 如何在angular js中将double转换为int
- 获取客户端'服务器端的s最大int值
- 如何在javascript中将String变量转换为int
- JavaScript:控制台的意外输出.log('str' + int + int)
- Angular 2:如何在 GET 和 POST 请求中设置 double、float、int 和布尔类型参数
- Javascript 将 int 值转换为八位字节流数组
- 地图(int,int)期望由帖子请求
- 这是解析 Int 的有效方法吗?
- 在Javascript中是否有等效于C的*(unsigned int*)(char)= 123
- JavaScript Max unsigned int 32?
- iOS 在 WebCore 中崩溃::StorageMap::key(unsigned int)