基本上,我有一个文件,其中包含必须分析的多行。例如,我可能有这样的形式:“荷马·辛普森吃了@ 0x000000000000BEEF甜甜圈”
恢复名称很简单,它恢复了我吃过的他吃的甜甜圈的数量。换句话说,我想将此数字存储在uint64_t变量中。
我的第一种方法是简单地读取字符之间的数字并将其转换为小数(即,我将计算0 * 16 ^ 15 + 0 * 16 ^ 14 + ... + E * 16 ^ 1 + F * 16 ^ 0)。这种方法对我来说似乎非常昂贵,我相信必须有一种更好的方法来实现这一目标。但是,这种技术的优势在于,如果将数字写为“ @ 0x0000 0000 0000 BEEF”,我仍然可以将其转换为uint64_t变量。
我尝试的第二种方法是使用sscanf或strol(如许多其他文章所述,例如Convert hex string (char []) to int?)。这种方法的问题在于,我首先必须从原始字符串创建一个子字符串“ @ 0x000000000000BEEF”(对于strol也是如此)。同样,这项技术有效,但是如果我有“ @ 0x0000 0000 0000 BEEF”,它将不起作用。
我是否有一个聪明又简单的方法来恢复此数字并将其存储在uint64_t变量中?
此问题与其他帖子不同。他们要做的就是将十六进制字符串转换为uint64_t。我的问题不同。
我有一个不仅仅由十六进制值组成的字符串,十六进制值的格式可能会逐行变化,并且可能会有空格分隔的单词。例如,我可能有:
"Bart annoyed @00000000000000AA people today"
或者十六进制值可以这样写:
"Bart annoyed @0000 0000 0000 00AA people today"
如何从十六进制数字的每一行读取为字符串,然后可以将其转换为其他答案所示?
答案 0 :(得分:1)
扫描集可与sscanf
一起使用,以捕获行中直到@的部分。
然后扫描@0x
并使用%n
获取已处理的字符数,以用作进一步处理的索引。
使用%1x%n
扫描每个十六进制数字并计算处理的字符。这将迭代跳过行的空格。将扫描的字符数添加到index
中,然后使用input + index
在行中进行迭代。
将每个十六进制数字合并到十六进制值中。这将移动值,而or
是数字。
#include <stdio.h>
#include <inttypes.h>
#define SIZE 100
//so SIZE can be part of sscanf Format String
#define SSFS(x) #x
#define FS(x) SSFS(x)
int main( void) {
char input[SIZE + 1] = "Homer Simpson ate @0x0000 0000 0000 B E E F donuts";
char name[SIZE + 1] = "";
int index = 0;
int scanned = 0;
int digit = 0;
uint64_t hex = 0;
unsigned int hexdigit = 0;
sscanf ( input, "%"FS(SIZE)"[^@]@0x%n", name, &index);
if ( index) {
while ( digit < 16 && 1 == sscanf ( input + index, "%1x%n", &hexdigit, &scanned)) {
digit++;
index += scanned;
hex <<= 4;
hex |= hexdigit;
}
printf ( "name [%s] [%" PRIu64 "] [%s]\n", name, hex, input + index);
}
return 0;
}