【问题标题】:String of Bytes to Byte array c++字节字符串到字节数组c ++
【发布时间】:2021-01-03 10:26:36
【问题描述】:

我正在尝试制作采用此模式字符串的函数:

"07 C5 8F E1 FD CA 8C E2 D4 FD BC E5 03 C6 8F E2"

返回这个 BYTE 数组

BYTE pattern[] = { 0x07, 0xC5, 0x8F, 0xE1, 0xFD, 0xCA, 0x8C, 0xE2, 0xD4, 0xFD, 0xBC, 0xE5, 0x03,  0xC6, 0x8F, 0xE2};

我尝试了什么:

BYTE strPatternToByte(std::string pattern, int len)
{
    std::vector<std::string> tokens;
    std::string token;
    std::istringstream tokenStream(pattern);
    while(std::getline(tokenStream, token, ' '))
    {
        tokens.push_back(token);
    }
    BYTE somePtr[len];
    for ( int i=0 ; i < len ; i++)
    {
        somePtr[i] = '0x' +  tokens[i];
    }

    return somePtr;
}

但是转换为字节模式的行对我不起作用,

somePtr[i] = (byte) tokens[i];

在 c++ 中有没有办法自动将它们解析成字节或类似 java 的东西?

【问题讨论】:

  • 源代码中的另一个问题:您正在返回一个指向局部变量的指针,这是未定义的行为。此外,您正在使用 C++ 的非标准扩展 - 可变长度数组。
  • 我注意到了,那么您建议返回什么?

标签: c++ arrays hex byte


【解决方案1】:

问题在于(byte) tokens[i] 不会将字符串转换为另一种类型,而是要求编译器将tokens[i] 中的std::string 对象视为byte,它不是也可以' t 转换为。这基本上是你对编译器撒谎。事实上,基本上所有的 C 类型转换都应该是一个危险信号,表明你做错了。

一种解决方案是改用普通流提取运算符&gt;&gt; 将每个以空格分隔的十六进制序列解析为无符号整数:

std::vector<unsigned> values;
std::istringstream stream(pattern);

unsigned value;
while (stream >> std::hex >> value)
{
    values.push_back(value);
}

【讨论】:

  • 这解决了一些错误,但不是我的主要问题,由于某些原因它仍然没有按我的意愿返回..
  • @J.Steve 正如另一条评论中提到的,您显示的代码返回一个指向局部变量的指针。 但是转换为BYTE。使用向量,返回向量。
  • @Someprogrammerdude 为什么如果我将 unsigned 更改为 uint8_t 这不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2015-03-19
  • 2019-05-09
相关资源
最近更新 更多