C++ Arduino上的10字符字符串到int

C++ Arduino上的10字符字符串到int,c++,c,avr,arduino-uno,C++,C,Avr,Arduino Uno,在我当前的项目中,我有RFID徽章,可以向我的Arduino UNO(例如:2700BBA0E8)发送10个字符的ID。文档上写着“可打印ASCII”,但我不知道它是否总是[0-9A-F] 在Arduino上,内存有限: char是1字节 int是2个字节 long是4字节 一个int或long比char[10]短,比较起来更简单(strcmp()vs=),所以我想知道如何将一个接一个(串行)接收的10个字符转换成int或long 感谢您的帮助如前所述,您希望在只能存储4个字节的长中放入5个

在我当前的项目中,我有RFID徽章,可以向我的
Arduino UNO
(例如:
2700BBA0E8
)发送10个字符的ID。文档上写着“可打印ASCII”,但我不知道它是否总是
[0-9A-F]

在Arduino上,内存有限:

  • char
    1字节
  • int
    2个字节
  • long
    4字节
一个
int
long
char[10]
短,比较起来更简单(
strcmp()
vs
=
),所以我想知道如何将一个接一个(串行)接收的10个字符转换成
int
long


感谢您的帮助

如前所述,您希望在只能存储4个字节的
中放入5个字节。此外,还必须使用结构:

struct RFIDTagId
{
    unsigned long low;
    unsigned long high; // can also be unsigned char
};
使用类似的方法:

unsigned int hex2int(char c)
{
    if (c >= 'A' && c <= 'F')
        return (c - 'A' + 0x0A);
    if (c >= '0' && c <= '9')
        return c - '0';
    return 0;
}

void char2Id(char *src, RFIDTagId *dest)
{
    int i = 0;

    dest->low = 0;
    for(i = 0; i < 8; ++i)
    {
        dest->low |= hex2int(src[i]) << (i*4);
    }

    dest->high = 0;
    for(i = 8; i < 10; ++i)
    {
        dest->high |= hex2int(src[i]) << ((i-8)*4);
    }
}
或者如果你真的有c++:

bool operator==(RFIDTagId const & lhs, RFIDTagId const & rhs)
{
    return lhs.low == rhs.low && lhs.high == lhs.high;
}

即使是10个十六进制数字[0-9A-F]也将是5个字节,因此不止一个
。您可以简明扼要地将前2个值放入int,将后8个值放入long,并对这两个变量进行逻辑and比较,但我非常确定,这样做的额外代码将不仅仅是执行
strcmp
,而且更复杂。@antoh同样,如果将
int
long
放在同一个结构中,由于内存对齐,可能需要整整8个字节。(我不知道这对Arduino到底有什么作用)。@MarkusLaire,是的。有一些方法可以绕过内存对齐,比如使用
pragma pack
,但我不知道它们在Arduino上的工作情况如何(尽管我不知道为什么它不应该)。说到“比较简单”,AVR是一个8位处理器,它只有8位寄存器。因此,您不会像在32位处理器上那样获得字比较的好处。感谢您的回答,我正在寻找这种“按位移位”方法。但是现在,作为一个概念证明,有没有一种方法可以从10个字符的ID中生成一个唯一的“校验和”。这个散列存储在4个字节上,所以保存一个字节。这是一个相对简单的算法,易于在嵌入式设备中实现。IMHO,根据RFID ID的特殊性(根据一些RFID标准,ID的一部分用于制造商,另一部分用于序列号),发生冲突的概率非常小,所以可以使用它来识别标签。但要对5字节的数据进行完全完美的唯一哈希,您必须使用至少5字节的hash.Thx。实际上,我想用RFID CC制作一个电子版的垄断。最大值是4个玩家,所以即使我将最后4个字符转换为int或long,我认为碰撞风险几乎为0%。所以,为了确保,CRC32将是完美的。这是计划。第一个元素将是银行,然后我等待的董事会上,我将“挖”电气轨道,以胶水的RGB条纹(led的属性)。我一定会发布一个过程的视频。如果你感兴趣,我可以在这里发布githubI有趣:)。一切都会在arduino发生吗?或者arduino仅用于获取标签id?
bool operator==(RFIDTagId const & lhs, RFIDTagId const & rhs)
{
    return lhs.low == rhs.low && lhs.high == lhs.high;
}