2011-03-25 241 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

相關問題