我有一个文件,我必须使用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.
52
是char R
的十六进制,47
是char G
的十六进制。我想获得那个。我知道我可以使用查找表,这将有效,但我正在寻找更多不同的解决方案。尝试了很多但无济于事。
请帮助!!
答案 0 :(得分: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];
}
}
}
输出:
您好;
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;
}