Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1

std::string формата hex в unsigned char и обратно.

23.09.2021, 15:28. Показов 6346. Ответов 4

Студворк — интернет-сервис помощи студентам
Доброго, все до очевидного просто, есть строка, где каждые два символа являются байтом:
C++
1
std::string data = "000110";
Хочу получить на выходе массив формата char (простите за выражение, если не правильно выразился):
C++
1
2
3
4
unsigned char* payload;
payload[0] = 0x00;
payload[1] = 0x01;
payload[2] = 0x10;
Строка может иметь длину до 1024 символов (512 байт), то есть нужна именно функция преобразования строки, а не прямой подход.

P.S. в найденных темах не разобрался, из за скудного знания языка.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.09.2021, 15:28
Ответы с готовыми решениями:

Преобразовать const unsigned char* в std::string (или _bstr_t )
Здравствуйте старшие товарищи! Есть функция, которая возвращает результат типа const unsigned char*. а мне нужно получить ...

Преобразовать строку String в массив #define byte_t unsigned char и обратно
Собственно танцы с бубном долгое время. Подскажите пожалуйста, как правильно и оптимально это делать. Каждый символ строки при...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

4
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
23.09.2021, 16:04
Идея такая:
C++
1
2
3
4
    for(int i=0;i<data.size();i+=2)
    {
        payload[i/2]=(data[i]-'0')*16+(data[i+1]-'0');
    }
Только нужно еще учесть, что могут быть 16-ичные цифры 'a' - 'f'.
1
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
23.09.2021, 16:22  [ТС]
zss, нашел такой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void hex2uchar(std::string data, unsigned char* payload) {
    std::stringstream convertStream;
    for (int offset = 0, i = 0; offset < data.length(); offset += 2, i++) {
        unsigned int buffer;
 
        convertStream << std::hex << data.substr(offset, 2);
        convertStream >> std::hex >> buffer;
 
        payload[i] = static_cast<unsigned char>(buffer);
 
        convertStream.str(std::string());
        convertStream.clear();
    }
}
 
std::string data = "000110";
unsigned char payload[3];
hex2uchar(data, payload);
printf("Result:\r\n");
for (int i = 0; i < data.length() / 2; i++) {
    printf("%02X | ", payload[i]);
}
printf("\r\n");
Code
1
2
Result:
00 | 01 | 10 |
Добавлено через 1 минуту
zss, мда, твой вариант куда проще...

Добавлено через 11 минут
zss, если я правильно понял, то:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned char hex2uchar(char data) {
    if (data >= '0' && data <= '9')
        return data - '0';
    else if (data >= 'a' && data <= 'f')
        return 10 + data - 'a';
    else
        return 10 + data - 'A';
}
 
void hex2uchar(std::string data, unsigned char* payload) {
    for (int i = 0; i < data.size(); i += 2) {
        payload[i / 2] = hex2uchar(data[i]) * 16 + hex2uchar(data[i + 1]);
}
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
23.09.2021, 16:41
Fudthhh, вот такой вариант. Учитывается возможность нечетного количества hex-символов. В таком случае первый символ будет младшим полубайтом первого байта. Ну и возвращается еще и длина массива.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <iomanip>
 
unsigned char GetHex(char ch)
{
    if (ch >= '0' && ch <= '9')
        return ch & 0x0f;
    else
    {
        ch = toupper(ch);
        if (ch >= 'A' && ch <= 'F')
            return toupper(ch) - 'A' + 10;
        else
            return 0xff;
    }
}
 
unsigned char* str2hex(std::string str, size_t &iRes)
{
    size_t len = str.length();
    unsigned char* res = new unsigned char[(len + 1) / 2];
    iRes = 0;
    size_t iStr = 0;
    if (len & 1)
    {
        res[iRes++] = GetHex(str[iStr++]);
        --len;
    }
    while (len)
    {
        res[iRes++] = (GetHex(str[iStr++]) << 4) + GetHex(str[iStr++]);
        len -= 2;
    }
    return res;
}
 
int main()
{
    std::string data = "0001e0";
    size_t len;
    unsigned char* r = str2hex(data, len);
    for (size_t i = 0; i < len; ++i)
        std::cout << std::setfill('0') << std::setw(2) << std::hex << (unsigned int)r[i] << ' ';
}
0
Заблокирован
23.09.2021, 17:38
вариант c++17 :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
#include <charconv>
#include <iomanip>
using namespace std;
int main()
{
    string src = "000110aff0ff0e";
    vector<unsigned char> res(src.size()/2 + src.size()%2);
    const char * first = &src[0];
    const char * const last  = first + src.size();
    size_t i = 0;
    while(first < last){
        from_chars(first, first+2 > last ? first + 1 : first + 2 , res[i++], 16);
        first += 2;
    }
    
    for (auto v : res){
        cout << hex << setw(2) << setfill('0') << int(v) << ' ';
    }
    
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.09.2021, 17:38
Помогаю со студенческими работами здесь

Конвертация строк: System::String в массив char/wchar_t, std::string и обратно
How to: Convert System::String to wchar_t* or char* How to: Convert System::String to Standard String How to: Convert Standard String...

ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*')
int main() { string fileName, currWord, currMax = &quot;&quot;; cin&gt;&gt;fileName; freopen(fileName, &quot;r&quot;, stdin); while...

Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ?
Ну собственно сабж... std::fstream fs; fs.write((char*)..) В случае бинарного потока я допустим пишу байты функцией write, как...

Hex в unsigned char
Здравствуйте! У меня есть одна проблема, которую не могу решить, ну вот, у меня есть файл в нем hex строка, такого вида: 68 65 6c 6c 6f...

Как считать hex в unsigned char
Можно как нибудь считать строку в unsigned char по примеру char n; n = &quot;&quot;;? И плюс к тому как считать тот же unsigned char из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru