C ++将uint8_t转换为unsigned long

时间:2013-09-06 09:08:07

标签: c++ arrays performance casting

我正在使用spidev使用像这样的结构传输一些数据

struct spi_ioc_transfer tr = {
    .tx_buf = (unsigned long)tx,  // transferred 
    .rx_buf = (unsigned long)rx,  // received
    .len = ARRAY_SIZE(tx),
    .delay_usecs = delay,
    .speed_hz = speed,
    .bits_per_word = bits,
};

我要发送的数据是uint8_t tx[] = {0xAC, 0xDC} 所以我像这样投射数组:msg.tx_buf = (unsigned long)tx;

但这对于可移植性并不好,而且它依赖于endian。 有没有更好,更快的方法呢? 我还需要比较msg.tx_buf和msg.rx_buf的值,以确保正确写入值。

由于

3 个答案:

答案 0 :(得分:2)

如果你的“spidev”希望发送32位字(bits为32),那么你需要重新安排内存中的数据才能正确布局。

你需要这样做:

const uint32_t tx32[] = { tx[0], tx[1] };

然后将.tx_buf值设置为tx32,假设它想要发送数据的地址。请务必确保.len正确设置为2,仍然是。

答案 1 :(得分:1)

您可以使用位和移位操作组合这两个值:

tx_buf = tx [0] | (tx [1]<< 8);

它便携,易于理解。

答案 2 :(得分:-1)

您可以使用:

uint8_t tx[] = {0xAC, 0xDC};
unsigned long* longDataPtr = reinterpret_cast<unsigned long*>(tx);

现在longDataPtr是指向结果的指针。

但是,要使用reinterpret_cast,您需要在缓冲区中包含sizeof(unsigned long)个元素,否则结果将被破坏。