C++ 将文件中的十六进制数转换为ASCII
我有一个文件,我必须用fopen打开。现在这个文件的问题是它是一个十六进制文件,所以当我打开它时,我会看到十六进制数,例如RG是5247。现在,当我使用(C++ 将文件中的十六进制数转换为ASCII,c++,c,hex,ascii,C++,C,Hex,Ascii,我有一个文件,我必须用fopen打开。现在这个文件的问题是它是一个十六进制文件,所以当我打开它时,我会看到十六进制数,例如RG是5247。现在,当我使用(fgets(line,sizeof(line),fd)读取文件时 52是字符R的十六进制,47是字符G的十六进制。我想获得它。我知道我可以使用lookuptable,这会起作用,但我一直在寻找更不同的解决方案。我尝试了很多,但都没有成功 请提供帮助!!您可以将每对ASCII编码的十六进制数字转换为一个字符 大概是这样的: unsigned
fgets(line,sizeof(line),fd
)读取文件时
52
是字符R的十六进制,47
是字符G的十六进制。我想获得它。我知道我可以使用lookuptable,这会起作用,但我一直在寻找更不同的解决方案。我尝试了很多,但都没有成功
请提供帮助!!您可以将每对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);
您可以将每对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);
- 将十六进制转换为整数
- 将结果转换为字符,类似于
char res=(char)intValue;
//如果字符串字符仅为0-9,A-F,则此操作有效
//因为在“hex”到“int”中实现了映射`
整数十六进制到整数(字符c){
int first=c/16-3;//第一个是dec 48=char 0
int second=c%16;//1秒10秒16秒5秒16秒
//ascii字符的十进制代码0-9:48-57 A-E:65-69
//省略dec 58-64::@
//将第一个或第二个16范围映射到0-9或10-15
int结果=第一个*10+秒;
如果(结果>9)结果--;
返回结果;
}
int十六进制到ascii(字符c,字符d){
整数高=十六进制到整数(c)*16;
int低=十六进制到整数(d);
返回高+低;
}
int main(){
const char*st=“48656C6F3B”;
整数长度=strlen(st);
int i;
char-buf=0;
对于(i=0;i
输出:
你好,
运行成功(总时间:59毫秒)
- 将十六进制转换为整数
- 将结果转换为字符,类似于
char res=(char)intValue;
//如果字符串字符仅为0-9,A-F,则此操作有效
//因为在“hex”到“int”中实现了映射`
整数十六进制到整数(字符c){
int first=c/16-3;//第一个是dec 48=char 0
int second=c%16;//1秒10秒16秒5秒16秒
//ascii字符的十进制代码0-9:48-57 A-E:65-69
//省略dec 58-64::@
//将第一个或第二个16范围映射到0-9或10-15
int结果=第一个*10+秒;
如果(结果>9)结果--;
返回结果;
}
int十六进制到ascii(字符c,字符d){
整数高=十六进制到整数(c)*16;
int低=十六进制到整数(d);
返回高+低;
}
int main(){
const char*st=“48656C6F3B”;
整数长度=strlen(st);
int i;
char-buf=0;
对于(i=0;i
输出:
你好,
运行成功(总时间:59毫秒)
我刚刚读了一个小的十六进制文件,按照你的需要工作的C++代码:< /P>
#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;
}
#包括
#包括
#包括
#包括
#包括
char val(const std::string&s)
{
int x;
std::stringstream-ss;
ssx;
返回静态_-cast(x);
}
int main()
{
std::deque deq;
char ch;
std::字符串s;
标准::ifstream-fin(“input.hex”);
而(fin>>std::skipws>>ch){
if(ch!=“:”)//十六进制文件以“:”开头
deq.推回(ch);
如果(deq.size()==2)
{
s、 向后推(deq.front());
德克·波普·弗罗斯特();
s、 向后推(deq.front());
德克·波普·弗罗斯特();
STD::CUT< P>我刚刚读了一个小的十六进制文件,按照你的需要工作的C++代码:< /P>
#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;
}
#包括
#包括
#包括
#包括
#包括
char val(const std::string&s)
{
int x;
std::stringstream-ss;
ssx;
返回静态_-cast(x);
}
int main()
{
std::deque deq;
char ch;
std::字符串s;
标准::ifstream-fin(“input.hex”);
而(fin>>std::skipws>>ch){
if(ch!=“:”)//十六进制文件以“:”开头
deq.推回(ch);
如果(deq.size()==2)
{
s、 向后推(deq.front());
德克·波普·弗罗斯特();
s、 向后推(deq.front());
德克·波普·弗罗斯特();
std::Coutt没有“十六进制文件”这样的东西。这是一个十六进制文件。它是一个放在微型计算机上的闪存文件。@KerrekSB,他的意思是它实际上是一个英特尔十六进制记录,我想。@KerrekSB,我不得不同意OP,我们一直称之为十六进制文件。是的,它是一个英特尔十六进制记录文件。没有“十六进制文件”这样的东西。这是一个十六进制文件。这是一个放在微型计算机上的闪存文件。@KerrekSB,他的意思是它实际上是一个英特尔十六进制记录,我想。@KerrekSB,我必须同意OP,我们一直称它为十六进制文件。是的,它是一个英特尔十六进制记录文件。@Carl Norum:我想这是一个选择的问题。如果你使用十六进制数字,那么0x30就不会有问题。@CarlNorum,因为它是一个ASCII十六进制文件,因此数学要求使用ASCII“0”的字节值,即0x30。在非ASCII平台(例如OS/390或as/400 IBM平台)上运行此代码而且'0'
的文字字符编码不是0x30,因此您的代码将是不正确的。虽然我讨厌硬代码,但对于处理定义良好的源文件类型的多平台兼容性来说,这是有必要的。这是真的-我没有想到可能存在文件格式/系统字符集不兼容的问题。@Carl Norum:我想是的这是一个选择问题。如果您使用十六进制数字,则0x30不会有问题。@CarlNorum,因为它是ASCII十六进制文件,因此数学要求您使用ASCII“0”的字节值,即0x30。在非ASCII平台(例如OS/390或as/400 IBM平台)上运行此代码,即以及的文字字符编码
#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;
}