转换十六进制字符串十六进制值

转换十六进制字符串十六进制值

问题描述:

我有一个大的十六进制字符串转换十六进制字符串十六进制值

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

你可以这样做使用串流。

#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字符,它不工作。

逐个读入每个字符并将其转换为十六进制值(这很容易)。

然后,您需要在读取下一个数字之前,将该值乘以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

部分在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

约以下(我希望我可以缩短它,并使用一些库函数,任何想法?):

函数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; 
}