从std :: string转换为unsigned char []

时间:2011-03-25 15:57:49

标签: c++ string hex

假设我有一个字符串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被分成更小的十六进制字符。我怎样才能实现它?分离的算法很简单,但我无法弄清楚如何将字符串更改为unsigned char以及如何在字符串的开头添加0x和在字符结尾处添加U.

3 个答案:

答案 0 :(得分: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";
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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