我想构建一个函数来轻松地将包含十六进制代码的字符串(例如“0ae34e”)转换为包含等效ascii值的字符串,反之亦然。 我是否必须以2对值的形式剪切Hex字符串并再次将它们组合在一起,或者有一种方便的方法吗?
感谢
答案 0 :(得分:1)
如果你想使用更多c ++本地方式,你可以说
std::string str = "0x00f34" // for example
stringstream ss(str);
ss << hex;
int n;
ss >> n;
答案 1 :(得分:0)
sprintf
和sscanf
功能已经可以为您完成。这段代码是一个应该给你一个想法的例子。在使用之前,请仔细阅读功能参考和安全替代方案
#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;
}
#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月。