1

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

line[0] is 5
line[1] is 2
line[2] is 4
line[4] is 7. 

52是 的十六进制char R并且47是 的十六进制char G。我想得到那个。我知道我可以使用查找表,这会起作用,但我一直在寻找更多不同的解决方案。尝试了很多,但无济于事。

请帮忙!!

4

3 回答 3

1
  • 将十六进制转换为整数
  • 将结果转换为类似于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];
                }
        }
}

输出:

你好;

运行成功(总时间:59ms)

于 2013-08-25T17:08:59.870 回答
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);

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

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

unsigned char ch = line[0];
if (islower(ch))
   ch = toupper(ch);
unsigned int high = ch - 0x30;
if (high > 9)
   high -= 7;
etc
于 2013-08-25T17:02:57.093 回答
0

我刚刚阅读了一个小的十六进制文件,并按照您的需要使用了以下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;
}
于 2013-08-25T17:50:35.430 回答