Преобразование char * в uint16 и uint32

Я использую sqlite3 на C++. У меня возникли проблемы с получением результатов SQL из массива char в мою структуру.

class Row {
    public:
        uint8_t type;
        uint16_t user;
        uint32_t ipAddress;
        std::string name;
};

void SqlToRow(char **argv, Row *row){
    row->type = *(argv[0]);
    row->user = *(uint16_t*)argv[1];
    row->ipAddress = *(uint32_t*)argv[2];
    row->name = argv[3];
}

Единственные, что работают, это type и name. Остальные выглядят как случайные значения, например 892486210

Вы когда-нибудь раньше действительно использовали указатели char в C++? И какой смысл представлять пользователя или IP-адрес как одно целое число (если только они не должны быть чем-то вроде внешних ключей)?

Christian Hackl 19.03.2018 20:42

Было бы полезно увидеть вызов SqlToRow (), чтобы узнать, что передается.

davernator 19.03.2018 20:43

@Christian Hackl Что ваш вопрос помогает найти решение?

ICU_ 19.03.2018 20:46

@ICU_: Спасибо за вопрос. Первый вопрос определяет, стоит ли начинать объяснение основной концепции char*. Второй вопрос помогает угадать ожидаемое поведение.

Christian Hackl 19.03.2018 20:50

# 1 Да, когда мне нужно поговорить о вещах C. Обычно это не двойные указатели. # 2 IP-адреса полезны как целые числа без знака, когда их действительно нужно использовать в сети.

ICU_ 19.03.2018 20:55

@ICU_: "IP-адреса полезны как беззнаковые целые числа" - только адреса IPv4, так как они составляют 4 байта, которые могут уместиться в одно целое число. Адреса IPv6 составляют 16 байтов, и ни один современный компилятор не имеет встроенного 128-битного числового типа (во всяком случае, адрес IPv6 представляет собой массив из 8 2-байтовых целых чисел).

Remy Lebeau 19.03.2018 21:06

@RemyLebeau Тогда хорошо, что мы живем в мире ipv4 :)

ICU_ 19.03.2018 21:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
294
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка в том, что вы пытаетесь повторно интерпретировать значения char* как числовые. Используйте sscanf с SCNu16 и SCNu32, например:

sscanf(argv[1], "%" SCNu16, &row->user);
sscanf(argv[2], "%" SCNu32, &row-> ipAddress);

Я принял ответ, но у меня нет доступа к этим макросам. Я использовал ul для 32, не уверен, что использовать для 16.

ICU_ 19.03.2018 21:08

- Я использовал "% u" и "% hu"

ICU_ 19.03.2018 21:24

@ICU_ Эти макросы должны быть доступны в заголовке cinttypes.

Sergey Kalinichenko 19.03.2018 21:39

Другие вопросы по теме