关于生锈编程语言的一个简单问题。 假设您在C中有以下内容:
uint8_t *someblockofdata; /* has certain length of 4 */
uint32_t *anotherway = (uint32_t*) someblockofdata;
无论代码不是那么有用而且相当丑陋,我怎么会生锈呢?假设您有一个&[u8]
,其长度可被4整除,您将如何转换"它到&[u32]
并返回(最好尽可能避免使用不安全的代码并保持尽可能快的速度)。
为了完成,我想要这样做的一个应用程序从文件中读取u8
然后操作它们。
答案 0 :(得分:2)
重新解释强制转换指针是在指向alignment-compatible类型对象的指针之间定义的,并且它在某些实现中可能有效,但它不可移植。首先,结果取决于数据的endianness(字节顺序),因此无论如何通过字节交换都可能会失去性能。
首先按如下方式重写C,验证它是否符合预期,然后将其翻译为Rust。
// If the bytes in the file are little endian (10 32 means 0x3210), do this:
uint32_t value = someblockofdata[0] | (someblockofdata[1] << 8)
| (someblockofdata[2] << 16) | (someblockofdata[3] << 24);
// If the bytes in the file are big endian (32 10 means 0x3210), do this:
uint32_t value = someblockofdata[3] | (someblockofdata[2] << 8)
| (someblockofdata[1] << 16) | (someblockofdata[0] << 24);
// Middle endian is left as an exercise for the reader.