将十六进制的字节数组转换为字符数组或字符串类型+ Arduino

3

我需要将十六进制表示的字节数组转换成字符串。

例如:

byte array[4] = {0xAB, 0xCD, 0xEF, 0x99};
//array[0] = 0xAB;
//array[1] = 0xCD;
//array[2] = 0xEF;
//array[3] = 0x99;

将上述内容转换为:

char number[9]; //Should be "ABCDEF99"

我已经反过来做了。也就是将字符数组转换成字节数组。
char CardNumber[9] = "ABCDEF99";
byte j;
auto getNum = [](char c)
{
  return c > '9' ? c - 'a' + 10 : c - '0';
};

char arr[10];
char i;
byte *ptr = out;

for (i = 0; i < 8; i++)
{
  arr[i] = CardNumber[i];
}

for (char *index = arr ; *index ; ++index, ++ptr )
{
  *ptr = (getNum( *index++ ) << 4) + getNum(*index);
}

//Check converted byte values.
Serial.print("Card Number in Bytes :");
for (j = 0; j < 4; j++)
{
  Serial.print(out[j], HEX );
}
Serial.println();

从技术上讲,字面字符串“ABCDEF99”是一个由九个字符组成的数组(您忘记了字符串终止符)。 - Some programmer dude
@Someprogrammerdude 是的!已编辑。 - Learner Learner
1
@JLH 他想要相反的。 - gre_gor
2
@LearnerLearner 为什么你接受了那个重复的内容?那是你想要的反面。而且你已经有了那个。 - gre_gor
1个回答

16

你需要遍历数组,并为每个半字节添加两个字符到字符串缓冲区中。
最后,你需要添加空终止符。

void array_to_string(byte array[], unsigned int len, char buffer[])
{
    for (unsigned int i = 0; i < len; i++)
    {
        byte nib1 = (array[i] >> 4) & 0x0F;
        byte nib2 = (array[i] >> 0) & 0x0F;
        buffer[i*2+0] = nib1  < 0xA ? '0' + nib1  : 'A' + nib1  - 0xA;
        buffer[i*2+1] = nib2  < 0xA ? '0' + nib2  : 'A' + nib2  - 0xA;
    }
    buffer[len*2] = '\0';
}

然后您将其用作:

byte array[4] = {0xAB, 0xCD, 0xEF, 0x99};
char str[32] = "";
array_to_string(array, 4, str);
Serial.println(str);

你如何将类似于“00000b0d”的字符串反转为字节数组? - Christophe Chenel
@ChristopheChenel 请检查无效的重复目标。 - gre_gor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接