Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将文件中的十六进制数转换为ASCII_C++_C_Hex_Ascii - Fatal编程技术网

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

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

我有一个文件,我必须用fopen打开。现在这个文件的问题是它是一个十六进制文件,所以当我打开它时,我会看到十六进制数,例如RG是5247。现在,当我使用(
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;
}