【问题标题】:Convert string to bytes in c++在 C++ 中将字符串转换为字节
【发布时间】:2018-06-23 14:05:46
【问题描述】:

我是 C++ 新手,但仍在尝试自己的方式。我试图调整我在 SO 上找到的一个函数,以便根据需要将我的字符串转换为字节:

void hexconvert(const char *text, unsigned char bytes[])
{
    int i;
    int temp;

    for (i = 0; i < 4; ++i) {
        sscanf(text + 2 * i, "%2x", &temp);
        bytes[i] = temp;
    }

    cout << bytes;
}

hexconvert("SKY 000.001\n", );

我遇到的问题是:

1) 我不确定如何修改 for 循环来处理我的字符串。 2) 我不确定我应该使用什么作为函数中第二个参数的输入。

有人可以帮忙吗?

谢谢

【问题讨论】:

  • 你为什么不直接做std::cout &lt;&lt; std::hex &lt;&lt; whatever &lt;&lt; std::endl;
  • 您好,感谢您的回复。如果我需要访问我的变量而不是控制台打印,这将如何工作?

标签: c++ string byte


【解决方案1】:

这是我建议的解决方案。我用它将 GUID 编码为字节数组。它应该比必须对所有字符执行printf 获得更高的性能。

typedef unsigned char byte;

std::map<char, byte> char2hex = 
{
  {'0', 0x0},
  {'1', 0x1},
  {'2', 0x2},
  {'3', 0x3},
  {'4', 0x4},
  {'5', 0x5},
  {'6', 0x6},
  {'7', 0x7},
  {'8', 0x8},
  {'9', 0x9},
  {'a', 0xa},
  {'b', 0xb},
  {'c', 0xc},
  {'d', 0xd},
  {'e', 0xe},
  {'f', 0xf}
};

void convertToBytes(const string &chars, byte bytes[])
{
  for (size_t i = 0; i < chars.length() / 2; i++) {
    byte b1 = (byte)(char2hex[chars[2*i]] << 4);
    byte b2 = char2hex[chars[2*i+1]];
    byte f = b1 | b2;
    *(bytes + i) = f;
  }
}

请记住,两个 ascii 字符组成一个字节,因此对于每一对字符,我必须将第一个字符转换为字节,然后将其向上移动 4 位,然后将其与下一个字符一起获得一个字节。

【讨论】:

    【解决方案2】:

    将字符串打印为字节:

    const size_t length = data.length();
    for (size_t i = 0; i < length; ++i)
    {
      unsigned int value = data[i];
      std::cout << std::dec << std::fill(' ') << value
                << " (0x" << std::setw(2) << std::setfill('0') << std::hex << value << ')'
                << "\n";
    }
    

    需要记住的一些重要规则:
    1. 将字符复制到整数类型变量中,使cout不打印为字符。
    2. 字节是无符号的。
    3. 十六进制用0填充宽度时,记得在打印十进制之前将其重置为空格。
    4. 使用std::hex 以十六进制打印,并记得在之后使用std::dec 重置它(如果您在之后打印十进制)。

    &lt;iomanip&gt;

    编辑 1:C 风格
    使用 C 语言风格:

    static const char data[] = "Hello World!";
    const size_t length = strlen(data);
    for (size_t i = 0; i < length; ++i)
    {
      printf("%3d (0x%02X)\n", data[i], data[i]);
    }
    

    以上假设data是一个字符数组,以nul结尾。

    【讨论】:

      猜你喜欢
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 2017-12-11
      • 2011-04-17
      • 2018-03-20
      • 2019-10-10
      相关资源
      最近更新 更多