将Hex String转换为Hex值

时间:2010-09-29 20:24:37

标签: c++

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

abcdef...

我希望将其转换为

0xab 0xcd 0xef 

有没有这样做的功能?

当人们问这些输入是否与ASCII时,你能告诉我我的意思吗? abcdef表示为字符串。不确定是否是ASCII。不确定他们的意思。我是编程新手,所以在这里提供帮助将不胜感激。我有一个巨大的字符串,我需要在我的数组中使用并将其转换为上述格式将帮助我使用十六进制字符串初始化我的数组。

4 个答案:

答案 0 :(得分:1)

逐个读入每个字符并将其转换为十六进制值(这非常简单)。

然后,您需要在读取下一个数字之前将该值乘以16(或实际上,将其向左移动4)并读取下一个数字,然后将其添加到您目前为止的数字。继续前行,直到你到达字符串的末尾。

当有人问他们输入的是ASCII时,他们指的是你的十六进制字符串是否使用ASCII encoding.进行编码。同样多种其他编码方法,从过时的EBCDIC到更现代的{{3} }(它有不同的编码,仍然都是unicode)。

请记住,数字0到9,a到f和A到F具有在编码中彼此相继的ASCII(或实际上是unicode)值。因此,对于数字,您可以通过执行“character - '0'”来计算其REAL值。对于0,这将给你0和最多9,它将给你9 ...

答案 1 :(得分:1)

C中需要的部件套件

for (..,i+=2)

strtoul(..,16)

答案 2 :(得分: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,则stringstream的转换会尝试将其转换为ASCII字符,但不起作用。

答案 3 :(得分:0)

大致如下(我希望我能缩短它并使用一些库函数,任何想法?):

函数string_to_vector将字符串及其长度作为输入。它遍历字符串,一次处理两个字符(str[ i ]str[ i + 1 ])。 (对于n的奇数值,最后一次传递只处理一个字符(str[ i ]。)。每个字符使用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 int值。

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