将 std::十六进制字符串转换为 std::array<T, 6>

Converting std::string of hexadecimal to std::array<T, 6>

本文关键字:std gt lt array 十六进制 字符串 转换      更新时间:2023-10-16

一个代表6个十六进制值的12个字节字符串,需要转换为 std:array<uint8_t,6>。我从十六进制的转换中获得了错误的结果。我在此处重新使用了一些代码,以进行字符串的十六进制转换。谢谢你的时间

代码

std::vector<std::array<uint8_t,6> > tracker =
  {
    { 0x66, 0x66, 0x66, 0x66, 0x66, 0x66 },
    { 0x99, 0x99, 0x99, 0x99, 0x99, 0x99 }
  };
std::array<uint8_t, 6> singular= { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 };
void setMac() {
  Serial.println("MAC TEST 1");
  std::string macInput = "121212121212";
  macTrans(macInput);
  tracker.push_back(singular);
  for (const auto& target : tracker)
  {
    printf("%02x:%02x:%02x:%02x:%02x:%02xn", target[0], target[1], target[2], target[3], target[4], target[5]);
  }
}
void macTrans(std::string mac){
    singular = HexToBytes(mac);
}
std::array<uint8_t,6> HexToBytes(const std::string& hex) {
  std::array<uint8_t,6> bytes;
  for (unsigned int i = 0; i < hex.length() && i < 12; i += 2) {
    std::string byteString = hex.substr(i, 2);
    uint8_t byte = (unsigned char) strtol(byteString.c_str(), NULL, 16);
    if (i==0)
      bytes[0] = byte;
    else
      bytes[i-1] = byte;
  }
  return bytes;
}

当前输出:

MAC TEST 1
66:66:66:66:66:66
99:99:99:99:99:99
12:12:30:12:fe:12

预期输出:

MAC TEST 1
66:66:66:66:66:66
99:99:99:99:99:99
12:12:12:12:12:12

HexToBytes中,您在数组外写作,但行为不确定。
(您正在写入0、1、3、5、7和9的位置。(

当您"重新利用"您发现的代码时,应该使用两个分裂而不是按一个减法使用。

替换

if (i==0)
  bytes[0] = byte;
else
  bytes[i-1] = byte;

  bytes[i/2] = byte;