2011-03-25 200 views
2

让我们假设我有一个字符串str它由缺省字符以十六进制(0-9,AF):转换为unsigned char []

string str="1234567890abcdef"; 

我也有一个空数组正的长度(N是已知的):

unsigned char arr[n] 

我想要做的是填补我阵列ARR与STR值,而是以特定的方式如下所示:

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

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

+0

你试图在这里达到什么样的最终结果?这是一个库的接口吗? – 2011-03-25 16:06:09

+0

我对你想“在开始时加上0x”的陈述感到困惑。你是否试图在运行时从'str'填充'arr []',或者在源代码中将一个表单转换为另一个表单? – Andy 2011-03-25 16:07:04

+0

可能的重复[从std :: string存储十六进制值,并且反之亦然?](http://stackoverflow.com/questions/4843369/storing-hexadecimal-values-from-a-stdstring- in-a-stdvector-and-vise-versa) – 2011-03-25 16:09:13

回答

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

0x12U实际上是unsigned int而不是char。它恰好适合于字符。最重要的是,它只是编译器使用的文字。一旦进入内存,数字都会变成二进制位。

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

相关问题