【问题标题】:Conversion from std::string to unsigned char[]从 std::string 转换为 unsigned char[]
【发布时间】:2011-07-23 00:55:20
【问题描述】:

假设我有一个字符串 str,它由默认为十六进制系统 (0-9, a-f) 的字符组成:

string str="1234567890abcdef";

我还有一个 n 长度的空数组(n 是已知的):

unsigned char arr[n] 

我想做的是用 str 的值填充我的数组 arr ,但具体方式如下所示:

unsigned char arr[8] = {0x12U, 0x34U, 0x56U, 0x78U, 0x90U, 0xabU, 0xcdU, 0xefU};

正如它所呈现的那样,字符串 str 被分成更小的十六进制字符。我怎样才能实现它?分隔算法很简单,但我不知道如何将字符串更改为无符号字符以及如何在字符开头添加 0x 和在字符末尾添加 U。

【问题讨论】:

  • 你想在这里达到什么最终结果?这是图书馆的接口吗?
  • 我对您要“在开头添加 0x”的声明感到困惑。您是想在运行时从str 填充arr[],还是在源代码中将一种形式转换为另一种形式?
  • @Andy:Mayby 我不够清楚,抱歉。 “在开头添加 0x”是指在我的源代码(十六进制)中将一种形式(str)转换为另一种形式。

标签: c++ string hex


【解决方案1】:

如果您需要一个不太具体的版本,您也可以考虑使用delimited list builder 模式。

【讨论】:

    【解决方案2】:

    您的要求有些不清楚。以下程序是否执行您想要的操作?

    #include <string>
    #include <iostream>
    #include <cstdio>
    #include <iterator>
    #include <algorithm>
    
    
    void str2bin(const std::string& in, unsigned char out[])
    {
    
        const char* data = in.data();
        const std::string::size_type size = in.size();
        for(std::string::size_type i = 0; i < size; i+= 2) {
            unsigned int tmp;
            std::sscanf(data+i, "%02X", &tmp);
            out[i/2] = tmp;
        }
    }
    
    int main() {
        unsigned char arr[8];
        str2bin("1234567890abcdef", arr);
        std::cout << std::hex;
        std::copy(arr, arr+8, std::ostream_iterator<unsigned int>(std::cout, ", "));
        std::cout << "\n";
    }
    

    【讨论】:

      【解决方案3】:

      0x12U 实际上是 unsigned int,而不是 char。它恰好适合一个字符。最重要的是,它是仅由编译器使用的文字。一旦进入内存,数字就会全部变成二进制 - 一系列位。

      在这种情况下,您有一个包含十六进制数字的字符串。 IE。每个字符仅代表 4 位。你需要解析它。一个简单的函数是sscanf。格式说明符%2X 读取两个十六进制字符并将它们存储在一个 int 中。因此,您可以使用"%2X%2X%2X%2X%2X%2X%2X%2X"读取8个整数,然后将每个整数复制到对应的unsigned char

      【讨论】:

        猜你喜欢
        • 2013-07-18
        • 2012-11-04
        • 2020-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-23
        相关资源
        最近更新 更多