,c++"/>

首页 > 解决方案 > 将十六进制的 std::string 转换为 std::array

问题描述

代表 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:%02x\n", 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

标签: c++

解决方案


HexToBytes中,您在数组外部写入,并且具有未定义的行为。
(您正在写入位置 0、1、3、5、7 和 9。)

当您“重新利用”您找到的代码时,您应该使用除以二而不是减一。

代替

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

  bytes[i/2] = byte;

推荐阅读