【问题标题】:Converting between unsigned long and uint8_t array在 unsigned long 和 uint8_t 数组之间转换
【发布时间】:2019-03-29 20:28:59
【问题描述】:

我正在尝试向 NFC 卡读取和写入无符号长类型值。

我正在使用 pn532 模块、MifareUltralight 卡和 Adafruit 库。 mifareultralight_WritePage 函数似乎只接受 4 字节大小的 uint8_t 类型数组。

所以我想把一个四字节长的类型的值一个一个的存入一个Uint8_t数组中,并将一个4字节长度的Uint8_t数组转换成一个长类型变量。

#include <Adafruit_PN532.h>

...

uint8_t writeBuffer[4] = { 18, 52, 86, 120 };
nfc.mifareultralight_WritePage(8, writeBuffer);
uint8_t readBuffer[4];
success = nfc.mifareultralight_ReadPage(i, &readBuffer[0]);
    if (success) {
        nfc.PrintHex(readBuffer, 4);
}

【问题讨论】:

  • 你的问题是什么?小/大端顺序?
  • 80C51 是大端,但您必须查看文档以了解 mifare 模块发送字节的顺序。
  • @bruno 我不熟悉 C。所以,我无法在 unsigned long 和 uint8_t [] 之间进行类型转换
  • @snark 我回答了
  • @AlainMerigot 8051 是一个 8 位的恐龙,所以它没有字节序。我相信它根据小端存储地址。英特尔是排名第一的小端十字军。

标签: c arduino mifare adafruit


【解决方案1】:

uint8_t writeBuffer[4] = { 18, 52, 86, 120 };

如果索引 0 包含低字节,例如就这样做

uint8_t writeBuffer[4] = { 18, 52, 86, 120 };
unsigned long v = writeBuffer[0];

for (size_t i = 1; i != 4; ++i)
  v += ((unsigned long) writeBuffer[i]) << (i * 8);

如果索引 0 包含更高的字节,就这样做

uint8_t writeBuffer[4] = { 18, 52, 86, 120 };
unsigned long v = writeBuffer[3];

for (size_t i = 1; i != 4; ++i)
  v += ((unsigned long) writeBuffer[3 - i]) << (i * 8);

【讨论】:

  • 由于我的英语很糟糕,这个问题似乎不准确。无论如何,移位运算符的这种用法向我展示了一种方法。谢谢。
  • @snark 没问题。如果您愿意,您可以删除您的问题,或对其进行编辑以删除所有与硬件有关的内容并保持一般性但符合其标题(在这种情况下,您可以接受我的回答)。良好的延续
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
相关资源
最近更新 更多