处理来自和来自十六进制的转换

时间:2012-03-08 16:11:56

标签: c++ hex ascii

我想构建一个函数来轻松地将包含十六进制代码的字符串(例如“0ae34e”)转换为包含等效ascii值的字符串,反之亦然。 我是否必须以2对值的形式剪切Hex字符串并再次将它们组合在一起,或者有一种方便的方法吗?

感谢

3 个答案:

答案 0 :(得分:1)

如果你想使用更多c ++本地方式,你可以说

std::string str = "0x00f34" // for example

stringstream ss(str);

ss << hex;

int n;

ss >> n;

答案 1 :(得分:0)

sprintfsscanf功能已经可以为您完成。这段代码是一个应该给你一个想法的例子。在使用之前,请仔细阅读功能参考和安全替代方案

#include <stdio.h>
int main()
{
 int i;
 char str[80]={0};
 char input[80]="0x01F1";
 int output;
 /* convert a hex input to integer in string */
 printf ("Hex number: ");
 scanf ("%x",&i);
 sprintf (str,"%d",i,i);
 printf("%s\n",str);
/* convert input in hex to integer in string */
 sscanf(input,"%x",&output);
 printf("%d\n",output);
}

答案 2 :(得分:0)

基于Python的binascii_unhexlify()函数:

#include <cctype> // is*

int to_int(int c) {
  if (not isxdigit(c)) return -1; // error: non-hexadecimal digit found
  if (isdigit(c)) return c - '0';
  if (isupper(c)) c = tolower(c);
  return c - 'a' + 10;
}

template<class InputIterator, class OutputIterator> int
unhexlify(InputIterator first, InputIterator last, OutputIterator ascii) {
  while (first != last) {
    int top = to_int(*first++);
    int bot = to_int(*first++);
    if (top == -1 or bot == -1)
      return -1; // error
    *ascii++ = (top << 4) + bot;
  }
  return 0;
}

Example

#include <iostream>

int main() {
  char hex[] = "7B5a7D";
  size_t len = sizeof(hex) - 1; // strlen
  char ascii[len/2+1];
  ascii[len/2] = '\0';

  if (unhexlify(hex, hex+len, ascii) < 0) return 1; // error
  std::cout << hex << " -> " << ascii << std::endl;
}

输出

7B5a7D -> {Z}

源代码中的评论有趣的引用:

  

我正在阅读几十个编码或解码的程序   这里的格式(文档?hihi :-)我已经制定了Jansen的   观察:

     

以ASCII格式编码以二进制数据编码的程序   它们尽可能不可读。使用的设备包括   不必要的全局变量,将重要的表格埋没在不相关的中   sourcefiles,将函数放入包含文件,使用   用于不同目的的看似描述性的变量名称,调用   空子程序和许多其他子程序。

     

我试图打破这种传统,但我猜是这样的   确实使性能次优。哦,太糟糕了......

     

Jack Jansen,CWI,1995年7月。