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

Best practice to represent bit string in hex (Arduino)

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

据我了解,位串需要按 4 位拆分为 6 个部分 "0001 0101 1110 0111 1010 1110" 然后各部分转成十六进制

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

那么将其转换为十六进制表示形式的最简单且经济高效的方法是什么:0x15e7ae?

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

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

这在 link 中完全可以找到: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);   
const char* binary = "000101011110011110101110" ;
char hex[9] = "" ;

uint32_t integer = 0 ;

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

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

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

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"。

背景
这是基于零的字符表示的最低有效位设置为零的假设。同样,one 的字符表示将最低有效位设置为 1。

算法将结果左移一位以为新的位值腾出空间。 取字符值并与 1 进行“与”运算会导致“0”的值为零,“1”的值为 1。此结果与 result 值进行或运算,以生成正确的值。

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

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

将其转换为十六进制字符串