重新解释内存/指针

时间:2014-12-10 18:46:02

标签: c rust

关于生锈编程语言的一个简单问题。 假设您在C中有以下内容:

uint8_t *someblockofdata; /* has certain length of 4 */
uint32_t *anotherway = (uint32_t*) someblockofdata;

无论代码不是那么有用而且相当丑陋,我怎么会生锈呢?假设您有一个&[u8],其长度可被4整除,您将如何转换"它到&[u32]并返回(最好尽可能避免使用不安全的代码并保持尽可能快的速度)。

为了完成,我想要这样做的一个应用程序从文件中读取u8然后操作它们。

1 个答案:

答案 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.