将文件中的十六进制数转换为ASCII

时间:2013-08-25 16:53:45

标签: c++ c hex ascii

我有一个文件,我必须使用fopen打开。现在文件的问题是它的一个hex文件,所以当我打开它时,我看到例如RG的十六进制数是5247.现在当我使用(fgets(line, sizeof(line), fd

读取文件时
line[0] is 5
line[1] is 2
line[2] is 4
line[4] is 7. 

52char R的十六进制,47char G的十六进制。我想获得那个。我知道我可以使用查找表,这将有效,但我正在寻找更多不同的解决方案。尝试了很多但无济于事。

请帮助!!

3 个答案:

答案 0 :(得分:1)

  • 将hex转换为int
  • 将结果转换为类似于char res = (char)intValue;
  • 的字符

代码:

// this works if the string chars are only  0-9, A-F 
// because of implemented mapping in `hex_to_int`

int hex_to_int(char c){
        int first = c / 16 - 3;//    1st is dec 48 = char 0
        int second = c % 16; //      10 in 1st16  5 in 2nd 16
        // decimal code of ascii char 0-9:48-57  A-E: 65-69
        // omit dec 58-64:  :,;,<,=,>,?,@
        // map first or second 16 range to 0-9 or 10-15
        int result = first*10 + second; 
        if(result > 9) result--;
        return result;
}

int hex_to_ascii(char c, char d){
        int high = hex_to_int(c) * 16;
        int low = hex_to_int(d);
        return high+low;
}

int main(){
        const char* st = "48656C6C6F3B";
        int length = strlen(st);
        int i;
        char buf = 0;
        for(i = 0; i < length; i++){
                if(i % 2 != 0){
                        printf("%c", hex_to_ascii(buf, st[i]));
                }else{
                        buf = st[i];
                }
        }
}

输出:

  

您好;

     

RUN SUCCESSFUL(总时间:59ms)

答案 1 :(得分:0)

您可以将每对ASCII编码的十六进制数字转换为字符。

这样的事情:

   unsigned int high = line[0] - 0x30;
   if (high > 9)
      high -= 7;
   unsigned int low  = line[1] - 0x30;
   if (low > 9)
      low -= 7;
   char c = (char) ((high << 4) | low);

当然,您可以优化上面的代码,并且您必须在变量&#34; line&#34;中的字符上写一个循环。

此外,如果使用小写字母,首先必须将它们转换为大写字母。像

unsigned char ch = line[0];
if (islower(ch))
   ch = toupper(ch);
unsigned int high = ch - 0x30;
if (high > 9)
   high -= 7;
etc

答案 2 :(得分:0)

我刚刚阅读了一个小的hex文件,并根据您的需要使用 C ++ 代码:

#include <iostream>
#include<fstream>
#include<deque>
#include<sstream>
#include<string>

char val(const std::string& s)
{
    int x;   
    std::stringstream ss;
    ss << std::hex << s;
    ss >> x;
    return static_cast<char> (x);
}

int main()
{

std::deque<char> deq;

char ch;
std::string s;

std::ifstream fin("input.hex");

while (fin >> std::skipws >> ch) {
    if(ch != ':') //Hex file begins with ':'
      deq.push_back(ch);
    if(deq.size() ==2)
    {
      s.push_back(deq.front());
      deq.pop_front();

      s.push_back(deq.front());
      deq.pop_front();

      std::cout<< s<<":"<<val(s)<<std::endl;;
      s.clear();
    }
}

 fin.close() ;

 return 0;
}