【问题标题】:How can I set a strings value from hex?如何从十六进制设置字符串值?
【发布时间】:2014-03-10 13:11:28
【问题描述】:

例如文本“召唤之书”的十六进制值为“42 6F 6F 6B 20 6F 66 20 53 75 6D 6D 6F 6E 69 6E 67” 所以我希望能够设置变量,就好像我将它设置为 string a = "book of summoing"; 但使用十六进制值。

使用这样的输入或类似的输入。 std::string hex = "42 6F 6F 6B 20 6F 66 20 53 75 6D 6D 6F 6E 69 6E 67";

我想用它设置一个字符串变量,使字符串看起来像“召唤书”;

就好像我要在调试模式下查看这个变量一样,字符串的每个字符都会有这些间隔的十六进制值之一。但是当然打印字符串会打印“召唤之书”。

如果我只是新的如何用一个角色来做,我可以构建这样一个功能。

或者,如果你可以使用十进制而不是十六进制,这也对我有用,因为我只是创建一个函数来从十六进制转换为十进制

编辑: 在调试模式下,我可以看到字符串 hex[0] first char 'B' 旁边有一个 66,我猜这是该字符的 dec 值。如果我新如何获取该值或通过设置该值来设置字符串,我可以做到这一切,但我不知道我是否能做到。

【问题讨论】:

  • 你应该解释一下什么是“召唤之书”以及你到底想要什么。其次,你需要表现出一些努力。 (向我们展示您的尝试。)
  • @olevegard 看起来字符串中的每个部分都是一个ASCII码,需要转换成所需的句子。
  • @juanchopanza 啊……当然。对我来说早上可能有点太早了。

标签: c++ hex


【解决方案1】:

像这样:

std::string hex = "42 6F 6F 6B 20 6F 66 20 53 75 6D 6D 6F 6E 69 6E 67";

std::istringstream iss(hex);
int i;
while (iss >> std::hex >> i)
    std::cout << static_cast<char>(i);
    // alternatively
    // s += static_cast<char>(i); 
    // where s is a std::string

这假定输入已经过清理并且包含适合char 的值。

Live demo.

【讨论】:

  • 这只是输出没有空格的十六进制字符串
  • @user1397417 不,再检查一次:)
  • 要明确iss &gt;&gt; std::hex &gt;&gt; i 步骤是删除流中的空格的步骤,它是一种格式化的流操作。
【解决方案2】:
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <iterator>
#include <algorithm>

int main()
{
    std::string hex = "42 6F 6F 6B 20 6F 66 20 53 75 6D 6D 6F 6E 69 6E 67";

    std::istringstream is( hex );

    is >> std::hex;

    std::copy( std::istream_iterator<int>( is ), std::istream_iterator<int>(),
               std::ostream_iterator<char>( std::cout ) );
    std::cout << std::endl;
}

编辑:我添加了错过的标题&lt;sstream&gt;

【讨论】:

    【解决方案3】:

    算法:

    • 开始遍历输入字符串
    • 在临时字符串中附加当前字符
    • 在每个空间,您:
      • 使用基数 16 通过strtol(或类似的 - 您可以指定基数)将临时字符串转换为临时数字
      • 将临时字符串重置为空
      • 获取临时号码的 ASCII 字符
      • 将其附加到最后一个字符串。

    只要输入字符串中有字符就继续。

    【讨论】:

      猜你喜欢
      • 2019-07-27
      • 2011-06-18
      • 2017-06-16
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-22
      • 1970-01-01
      相关资源
      最近更新 更多