【问题标题】:C++ convert uint8_t to unsigned longC++ 将 uint8_t 转换为 unsigned long
【发布时间】:2013-09-06 09:08:07
【问题描述】:

我正在使用这样的结构与 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;

但这不利于可移植性并且它依赖于字节序。 有没有更好更快的方法来做到这一点? 我还需要比较 msg.tx_buf 和 msg.rx_buf 的值,以确保值写入正确。

谢谢

【问题讨论】:

  • 以这种方式初始化结构成员的语法是什么?据我所知,这不是有效的 C++?
  • @jcoder:我以前见过,我认为它与C99规范有关。 C++0x 很可能采用了它。就像新的 C 和 C++ 规范中的大多数东西一样,它让我感到沮丧,因为它真正做的唯一事情就是让代码更难阅读:)
  • 请使用正确的 C++ 转换而不是 C 转换。
  • 代码取自 spidev_test.c。 kernel.org/doc/Documentation/spi/spidev_test.c 所以它是 C 语法,没有 C++。对此感到抱歉。

标签: c++ arrays performance casting


【解决方案1】:

如果您的“spidev”希望发送 32 位字(bits 是 32),那么您需要重新排列内存中的数据以正确布局。

你需要做的:

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

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

【讨论】:

    【解决方案2】:

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

    tx_buf = tx[ 0 ] | (tx[1]

    它是可移植的,而且很容易理解。

    【讨论】:

      【解决方案3】:

      你可以使用:

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

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

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

      【讨论】:

      • 我不确定这是否能满足 OP 的要求。该问题提到了字节顺序问题,并且仅当主机和端点具有相同的字节顺序时才有效。在字节顺序不同的情况下,我希望在可移植实现中看到类似 htons (...) 和 ntohs (...) 的内容。
      • -1,我真的不认为这有帮助。 SPI 设备(它需要一个指向 32 位数据的指针)如何成功读取 tx,它仍然是内存中单个 8 位值的打包数组?此外,C++ 强制转换运算符中有一个错字。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 2016-12-20
      • 1970-01-01
      相关资源
      最近更新 更多