c++ 十六进制之间的转换处理

uujelgoq  于 2023-05-08  发布在  其他
关注(0)|答案(3)|浏览(140)

我想建立一个函数来轻松地转换一个字符串包含十六进制代码(如。“0ae34e”)转换为包含等效ascii值的字符串,反之亦然。我必须把十六进制字符串切成两个值的一对,然后再把它们组合在一起吗?或者有什么方便的方法可以做到这一点?
谢谢

xriantvc

xriantvc1#

基于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:-)我已经制定了 Json 的观察:
以ASCII编码二进制数据的程序是以这样一种风格编写的,即它们尽可能不可读。使用的设备包括不必要的全局变量,将重要的表隐藏在不相关的源文件中,将函数放在包含文件中,使用看似描述性的变量名用于不同的目的,调用空的子例程和其他许多方法。
我试图打破这一传统,但我想这确实使性能次优。哦,太糟了...
Jack Jansen,CWI,1995年7月。

hzbexzde

hzbexzde2#

如果你想用一种更C++原生的方式,你可以说

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

stringstream ss(str);

ss << hex;

int n;

ss >> n;
cu6pst1q

cu6pst1q3#

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);
}

相关问题