【问题标题】:Input hex strings as char at once一次将十六进制字符串输入为 char
【发布时间】:2013-01-14 10:38:36
【问题描述】:

我有一个这样的字符串:

315c4eeaa8b5f8aaf9174145bf43e1784b8fa00dc71d885a804e5ee9fa40b16349c146fb778cdf2d3aff021dfff5

有没有办法将它从文件中一次读取到字符串对象中,记住每 2 个字符都是字节的十六进制表示? IE。我需要从十六进制转换为字符的读数。

更新
伙计们,请仔细阅读我的要求。
我能够编写转换函数并沿着字符串循环。
但是我需要一次将一个十六进制字符串读取为一个字符字符串
没有任何循环。没有手动转换。
类似cin >> ...some string variable...
谢谢。

更新2
想象一下我有字符串"315c4eeaa8b5"。我想写一些类似cin >> string_var 的东西,并得到恰好包含"'0x31','0x5c','0x4e','0xea','0xa8','0xb5'" 的string_var。请注意,最后一个是序数 std::string。 IE。 0x31,0x5c,etc 是字符代码。
希望它能让事情更清楚。

【问题讨论】:

  • 您的更新使其变得更加模糊。你想把这些数据从 hex-ascii 转换成任何东西 吗? 听起来您希望将字符对从 hex-ascii 转换为它们的 byte-equivs,在您提供的示例中,它恰好是下面的实际 ascii 字符。那是对的吗?所有这些都没有循环,没有转换,并且隐藏在某个提取运算符中。?
  • 是的,我确切地知道它们是什么,不,您无法通过简单的提取运算符得到它(除非您编写它并在其中执行 2-char-to-ordinal-code 转换说提取器)。在标准库中没有可以做你想做的事的灵丹妙药。而且您已经说过您可以/已经编写/编写了转换循环,还有什么其他的吗?
  • 我问过这个问题,我必须自己进行转换。
  • 恐怕你会。 iostreams 库可以使它变得非常简单,或者通过几个表查找和一个 4 位移位的或运算符来实现较低级别。这取决于你,但恐怕标准库中的罐装解决方案是行不通的。

标签: c++ hex


【解决方案1】:

要么编写代码,要么使用已经存在的东西。如果您使用的是 C++ IO 流,那么我建议您查看 Boost.IOStreams 库,尤其是它的 Filtering Streams 概念。您可以使用标签扩展 2.2.5.2 input_filter 教程示例作为您的十六进制输入过滤器实现的基础。

【讨论】:

    【解决方案2】:

    您可以使用 istream::opeartor>> 和 std::hex 操纵器来解析为十六进制:

    ifstream in("...");
    char buffer[3];
    vector<char> chars;
    
    while (in.read(buffer, 2))
    {
        buffer[2] = '\0';
    
        char c;
        istringstream(buffer) >> hex >> c;
        chars.push_back(c);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-18
      • 2016-09-15
      • 2018-01-31
      • 1970-01-01
      • 2018-01-22
      相关资源
      最近更新 更多