2010-09-29 317 views
0

我有一個大的十六進制字符串轉換十六進制字符串十六進制值

abcdef... 

,我想將它轉化成

0xab 0xcd 0xef 

有沒有做任何的功能呢?

你也可以告訴我,當人們問我是什麼意思是那些ASCII或不輸入? abcdef被表示爲一個字符串。不知道這是否是ASCII。不知道他們的意思。我很新的編程,所以幫助這裏將不勝感激。我有一個巨大的字符串,我需要在我的數組中使用,並將其轉換爲上述格式將幫助我使用十六進制字符串初始化我的數組。

+0

它很難理解你的意思,你是否試圖從'char * strRep =「abcdef」'轉到'int intRep = 11259375;'?或嘗試將字符串解析爲單獨的字節? – Nate 2010-09-29 20:28:42

+0

所以我只是有一個巨大的字符串....這實際上是一個十六進制字符串。所以像AFAB2591CFB70E77C7C417D8C389507A5 ...現在我想把它放在一個字節數組像const字節測試[] {0xaf,0xab ....};所以我想我想解析大字符串,所以我可以在我的代碼中使用它來初始化一個字節數組。這有幫助嗎? – 2010-09-29 20:31:10

回答

1

你可以這樣做使用串流。

#include <iostream> 
#include <sstream> 
#include <vector> 

int main(int , char **) 
{ 
    const char *str = "AFAB2591CFB70E77C7C417D8C389507A5"; 
    const char *p1 = str; 
    const char *p2 = p1; 

    std::vector<unsigned short> output; 

    while(*p2 != NULL) { 
    unsigned short byte; 

    ++p2; 
    if(*p2 != NULL) { 
     ++p2; 
    } 

    std::stringstream sstm(std::string(p1, p2)); 

    sstm.flags(std::ios_base::hex); 
    sstm >> byte; 

    output.push_back(byte); 

    p1 += 2; 
    } 

    for(std::vector<unsigned short>::const_iterator it = output.begin(); it != output.end(); ++it) { 
    std::cout << std::hex << std::showbase << *it << "\t" << std::dec << std::noshowbase << *it << "\n"; 
    } 

    std::cout << "Press any key to continue ..."; 
    std::cin.get(); 
} 

請注意,如果您使用unsigned char代替unsigned short轉換從字符串流試圖將其轉換成ASCII字符,它不工作。

1

逐個讀入每個字符並將其轉換爲十六進制值(這很容易)。

然後,您需要在讀取下一個數字之前,將該值乘以16(或確實將其左移4),然後在將其添加到目前爲止的數字之前讀取下一個數字。繼續下去,直到你到達弦的末尾。

當有人問,如果他們的投入是他們所指的是否存在,同樣其他各種編碼方法,範圍從過時的EBCDIC到更現代Unicode(其中有不同的編碼十六進制字符串使用ASCII encoding.編碼的ASCII這仍然全是unicode)。

請記住,編號中的數字0到9,a到f和A到F的ASCII值(或實際上是unicode)值相互接近。因此,對於數字,您可以通過執行「字符 - '0'」來計算其實際值。對於0這會給你0以及多達9個,它會給你9 ...

+0

所以沒有現有的功能,在c + +我不得不手動做到這一點? – 2010-09-29 20:46:50

1

部分在C需要的套件

for (..,i+=2) 

strtoul(..,16) 
+0

我使用C++我該如何做? – 2010-09-29 20:46:17

+0

@ user245823:與C中的一樣。C中的大多數事情都是用C++工作的,這不是例外之一。如果你有一個C++字符串的值,你將不得不通過'.c_str()'成員函數將它傳遞給'strtoul'。 – 2010-09-29 21:41:08

0

約以下(我希望我可以縮短它,並使用一些庫函數,任何想法?):

函數string_to_vector將字符串及其長度作爲輸入。它遍歷字符串,一次處理兩個字符(str[ i ]str[ i + 1 ])。 (對於奇數值n,最後一次傳遞過程只有一個字符(儘管如此)。每個字符都使用hex_char_to_int方法轉換爲數值,然後通過移位和相加「連接」兩個數值來構造一個數字。 ,構建的數字值被附加到其在該函數的末尾返回數值的矢量。

std::vector<unsigned> 
string_to_vector(const char * str, size_t n) { 
    std::vector<unsigned> result; 
    for(size_t i = 0; i < n; i += 2) { 
     unsigned number = hex_char_to_int(str[ i ]); // most signifcnt nibble 
     if((i + 1) < n) { 
      unsigned lsn = hex_char_to_int(str[ i + 1 ]); // least signt nibble 
      number = (number << 4) + lsn; 
     } 
     result.push_back(number); 
    } 
    return result; 
} 

下面的函數在範圍[0-9A-Za-z]到相應的無符號整型值轉換字符。

unsigned 
hex_char_to_int(char c) { 
    unsigned result = -1; 
    if(('0' <= c) && (c <= '9')) { 
     result = c - '0'; 
    } 
    else if(('A' <= c) && (c <= 'F')) { 
     result = 10 + c - 'A'; 
    } 
    else if(('a' <= c) && (c <= 'f')) { 
     result = 10 + c - 'a'; 
    } 
    else { 
     assert(0); 
    } 
    return result; 
} 
相關問題