首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Arduino:将十六进制字符串转换为uint64或十进制字符串

Arduino:将十六进制字符串转换为uint64或十进制字符串
EN

Stack Overflow用户
提问于 2016-04-18 09:45:43
回答 3查看 3.6K关注 0票数 3

我希望使用uint64变量将十六进制字符串(如"43a2be2a42380“)转换为它们的十进制表示形式。我需要这样做,因为我正在实现一个RFID阅读器,充当键盘,按键需要是十进制数字。

我见过其他答案(convert HEX string to Decimal in arduino)并使用strtoul实现解决方案,但它只适用于32位整数,而strtoull不可用。

代码语言:javascript
运行
复制
uint64_t res = 0;
String datatosend = String("43a2be2a42380");
char charBuf[datatosend.length() + 1];
datatosend.toCharArray(charBuf, datatosend.length() + 1) ;
res = strtoul(charBuf, NULL, 16);

如何使用Arduino获得大十六进制字符串/字节数组的十进制数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-18 09:59:48

您可以自己实现:

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdint.h>
#include <ctype.h>

uint64_t getUInt64fromHex(char const *str)
{
    uint64_t accumulator = 0;
    for (size_t i = 0 ; isxdigit((unsigned char)str[i]) ; ++i)
    {
        char c = str[i];
        accumulator *= 16;
        if (isdigit(c)) /* '0' .. '9'*/
            accumulator += c - '0';
        else if (isupper(c)) /* 'A' .. 'F'*/
            accumulator += c - 'A' + 10;
        else /* 'a' .. 'f'*/
            accumulator += c - 'a' + 10;

    }

    return accumulator;
}

int main(void)
{
    printf("%llu\n", (long long unsigned)getUInt64fromHex("43a2be2a42380"));
    return 0;
}
票数 5
EN

Stack Overflow用户

发布于 2016-04-18 09:50:18

..。解决方案使用strtoul,但它只适用于32位整数,并且strtoull不可用。

使用strtoul()进行两次,一次用于较低的四个字节,一次用于其余的,然后将两个结果相加,然后预先将后者乘以0x100000000LLU

票数 6
EN

Stack Overflow用户

发布于 2016-04-18 10:14:55

和更短的皈依:

代码语言:javascript
运行
复制
void str2hex(uint8_t * dst, uint8_t * str, uint16_t len)
{
    uint8_t byte;
    while (len) {
        byte = *str-(uint8_t)0x30;
        if (byte > (uint8_t)0x9) byte -= (uint8_t)0x7;
        *dst = byte << 4;
        str++;
        byte = *str-(uint8_t)0x30; 
        if (byte > (uint8_t)0x9) byte -= (uint8_t)0x7;
        *dst |= byte;
        str++; dst++;
        len -= (uint16_t)0x1;
    }
}

而不是从未签名的char缓冲区获取uint64_t:

代码语言:javascript
运行
复制
uint64_t hex2_64(uint8_t * ptr)
{
    uint64_t ret;
    ret = (uint64_t)((uint64_t)(*ptr) << (uint64_t)56); ptr++;
    ret |= (uint64_t)((uint64_t)(*ptr) << (uint64_t)48); ptr++;
    ret |= (uint64_t)((uint64_t)(*ptr) << (uint64_t)40); ptr++;
    ret |= (uint64_t)((uint64_t)(*ptr) << (uint64_t)32); ptr++;
    ret |= (uint64_t)((uint64_t)(*ptr) << (uint64_t)24); ptr++;
    ret |= (uint64_t)((uint64_t)(*ptr) << (uint64_t)16); ptr++;
    ret |= (uint64_t)((uint64_t)(*ptr) << (uint64_t)8); ptr++;
    ret |= (uint64_t)(*ptr);
    return ret;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36690492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档