Каков наилучший способ анализа строки с именами, шестнадцатеричными значениями и т. Д.? - PullRequest
0 голосов
/ 23 марта 2019

По сути, у меня есть файл, который содержит несколько строк, которые я должен проанализировать.Например, у меня может быть что-то в форме: «Гомер Симпсон съел @ 0x000000000000BEEF пончики»

Восстановить имя просто, оно восстанавливает количество пончиков, которые он съел, с которыми у меня проблемы.Другими словами, я хотел бы сохранить это число в переменной uint64_t.

Мой первый подход состоял в том, чтобы просто прочитать число от символа к символу и преобразовать его в десятичное число (т. Е. Я бы вычислил 0 * 16 ^15 + 0 * 16 ^ 14 + ... + E * 16 ^ 1 + F * 16 ^ 0).Этот метод кажется мне очень дорогостоящим, и я уверен, что должен быть лучший способ добиться этого.Однако этот метод имел то преимущество, что если бы число было написано так: «@ 0x0000 0000 0000 BEEF», я все равно смог бы преобразовать его в переменную uint64_t.

Второй метод, который я попробовал, заключался в использованииsscanf или strol (как описано во многих других сообщениях, таких как этот: Преобразовать шестнадцатеричную строку (char []) в int? ).Проблема с этим методом заключается в том, что мне сначала нужно создать подстроку "@ 0x000000000000BEEF" из исходной строки (то же самое относится и к прогулке).Опять же, эта техника работает, но она не сработает, если у меня будет "@ 0x0000 0000 0000 BEEF.

Есть ли для меня умный и простой способ восстановить это число и сохранить его в переменной uint64_t?

Этот вопрос не такой, как в других постах. Все, что им нужно сделать, чтобы преобразовать шестнадцатеричную строку в uint64_t. Мой вопрос другой.

У меня есть строка, которая не простосоставленный из шестнадцатеричного значения, формат шестнадцатеричного значения может изменяться от строки к строке и может содержать слова, разделенные пробелами. Например, у меня может быть:

"Bart annoyed @00000000000000AA people today"

Или шестнадцатеричное значение может быть записанокак это:

"Bart annoyed @0000 0000 0000 00AA people today"

Как мне прочитать каждую строку в форме шестнадцатеричного числа в виде строки, которую затем можно преобразовать, как показано в других ответах?

1 Ответ

1 голос
/ 24 марта 2019

Сканирование может использоваться с 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...