以十六进制表示位串的最佳实践(Arduino)

时间:2015-01-03 22:39:45

标签: c++ c binary arduino hex

我有一个字符串(或cstring)由24位“000101011110011110101110”组成,应以十六进制(0x15e7ae)表示。

据我所知,位串需要分成6位乘4位 “0001 0101 1110 0111 1010 1110”然后将每个部分转换为十六进制

0001 -> 1
0101 -> 5
1110 -> e
0111 -> 7
1010 -> a
1110 -> e

那么将它转换为十六进制表示的最简单且最具成本效益的方法是什么:0x15e7ae?

对于我来说,使用String或char []更好的字符串类型也是一个两难选择。可以使用substring函数轻松拆分字符串,但我不知道如何将字符串类型转换为十六进制。

相反,char []可以使用strtoul函数轻松转换为十六进制,但我找不到简单的方法来分割char字符串。

4 个答案:

答案 0 :(得分:1)

在这个链接中可以找到这一点:StringConstructors

 // using an int and a base (hexadecimal):
 stringOne =  String(45, HEX);   
 // prints "2d", which is the hexadecimal version of decimal 45:
 Serial.println(stringOne);   

答案 1 :(得分:1)

const char* binary = "000101011110011110101110" ;
char hex[9] = "" ;

uint32_t integer = 0 ;

for( int i = 0; binary[i+1] != '\0'; i++ )
{
    if( binary[i] == '1' )
    {
        integer |= 1 ;
    }
    integer <<= 1 ;
}

sprintf( hex, "0x%06x", integer ) ;

答案 2 :(得分:1)

让我们尝试一些简单的位移。

std::string sample_str = "000101011110011110101110";
uint32_t result = 0;
for (unsigned int i = 0; i < sample_str.length(); ++i)
{
  result = result << 1;
  result = result | (sample_str[i] & 1);
}

可能有更快的方法,但你必须在网上搜索“bit twiddling string”。

<强>背景
这是基于零的字符表示将最低有效位设置为零的假设。同样,一个字符表示的最低有效位设置为一。

算法将结果左移一个,以便为新的比特值腾出空间。 将字符值和AND与1一起导致'0'的值为0,而'1'的值为0。将此结果与result值进行OR运算,以生成正确的值。

尝试使用调试器单步执行以查看其工作原理。

答案 3 :(得分:1)

在C中,这很简单。使用strtoumax(binary, 0, 2)将二进制字符串转换为uintmax_t,然后将其转换为包含sprintffprintf的十六进制字符串。