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
解决方案
在HexToBytes
中,您在数组外部写入,并且具有未定义的行为。
(您正在写入位置 0、1、3、5、7 和 9。)
当您“重新利用”您找到的代码时,您应该使用除以二而不是减一。
代替
if (i==0)
bytes[0] = byte;
else
bytes[i-1] = byte;
和
bytes[i/2] = byte;
推荐阅读
- python - 按列集分组,列中的第一个非零值和全零之一需要标记为 1,其余为 0
- annotations - 为什么“加载小部件”。消息出现在 JupyterLab 中?
- python - 为什么 statsmodels 中的指数平滑会为时间序列预测返回相同的值?
- react-native - 如何从屏幕 1 导航到屏幕 b?
- python - AttributeError:类型对象“netCDF4._netCDF4._MemBuf”没有属性“__reduce_cython__”
- c# - 如何在 IMongoCollection.Find() 方法中使用 if 语句?
- c# - 使用 Json.NET (C#) 从 json 中读取子对象作为字符串
- python - '_UnreadVariable' 对象在尝试运行 keras 优化器时没有属性 'run'
- javascript - 未选中 runtime.lastError: 无法建立连接。接收端不存在。Chrome 扩展程序
- unity3d - Unity 2D 在图块上方显示“闪光效果”