powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в stringstream сделать %02X
22 сообщений из 22, страница 1 из 1
Как в stringstream сделать %02X
    #38680837
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так работает
Код: plaintext
1.
2.
3.
4.
stringstream buff("");
char ch[8];
sprintf(ch, "%02X", (unsigned char)outBuff[i]);
buff << ch;



а так нет
Код: plaintext
1.
2.
stringstream buff("");
buff << setfill('0') << setw(2) << setiosflags(ios::hex|ios::uppercase) << (unsigned char)outBuff[i];
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38680839
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если важно то
Код: plaintext
1.
 char* outBuff = (char*)malloc(textLen);
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681076
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverin
а так нет
Код: plaintext
1.
2.
stringstream buff("");
buff << setfill('0') << setw(2) << setiosflags(ios::hex|ios::uppercase) << (unsigned char)outBuff[i];



А так

Код: plaintext
1.
ch=((outBuff[i]>>4)*0xa)+(outBuff[i]&0xf);
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681142
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чё просто не написать?
Код: plaintext
1.
printf("%02X", (unsigned char)outBuff[i]);
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681148
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverinТак работает
а так нет
Код: plaintext
1.
2.
stringstream buff("");
buff << setfill('0') << setw(2) << setiosflags(ios::hex|ios::uppercase) << (unsigned char)outBuff[i];



1) setiosflags(ios::hex|ios::uppercase) - это какая-то ересь. Где вы такое нашли?. Я даже не уверен что оно что-то полезное делает.
Для этого существует
Код: plaintext
1.
<< hex << uppercase <<



2) Чтобы распечатать символ как число его нужно преобразовать в число.
unsigned char - это не число, а все еще символ.
Поэтому преобразовывать надо к unsigned int.
Но тут тоже не все так просто.
На многих платформах, char - знаковый, а значит при преобразовании (unsigned int) произойдет сначала расширение знака до int, а потом уже преобразование к unsigned, и для символов с кодами больше 0x7F получится что-то типа FFFFFFxx.
Поэтому сначала нужно убрать знак
Код: plaintext
1.
(unsigned int)(unsigned char)ch


Но это слишком громоздкая конструкция. Есть простой хак который делает то же самое:
Код: plaintext
1.
ch & 0xFF


Здесь побитовое И делается с 0xFF что убирает старшие разряды с расширенным битом знака и результат побитовых операции всегда unsigned int. Что нам и требуется.


Таким образом ответ такой:
Официально:
Код: plaintext
1.
buff << setfill('0') << setw(2) << hex << uppercase << (unsigned int)(unsigned char)(outBuff[i]);


или короче:
Код: plaintext
1.
buff << setfill('0') << setw(2) << hex << uppercase << (outBuff[i] & 0xFF);
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681387
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky1) setiosflags(ios::hex|ios::uppercase) - это какая-то ересь. Где вы такое нашли?. Я даже не уверен что оно что-то полезное делает.

вот так просто работало (вычитал где то), решил по аналогии :)
Код: plaintext
1.
out << '\"' << setiosflags(ios::fixed) << setfill('0') << setprecision(2) << fval << '\"';


хотя вариант тоже работает ))
Код: plaintext
1.
out << '\"' << fixed << setfill('0') << setprecision(2) << fval << '\"';




Anatoly MoskovskyТаким образом ответ такой:
Официально:
Код: plaintext
1.
buff << setfill('0') << setw(2) << hex << uppercase << (unsigned int)(unsigned char)(outBuff[i]);



спасибо, вроде получилось (покрайней мере выходит строка после шифрования gcry_cipher_encrypt библиотекой libgcrypt), нужно только теперь обратно конвертнуть (из 16ти ричного получить символ), чтобы дешифровать, сейчас проверю.
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681388
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smaldА так

Код: plaintext
1.
ch=((outBuff[i]>>4)*0xa)+(outBuff[i]&0xf);


спасибо, но не проверял, т.к. не понимаю хака )
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681389
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА чё просто не написать?
Код: plaintext
1.
printf("%02X", (unsigned char)outBuff[i]);


потому что мне надо не в stdout, а в сокет ответить.
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681400
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

а не подскажете как сделать обратную операцию? их стрима в чар
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681402
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
* из 16ти ричного стрима в чар
пробовал так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int i = 0;
            char ch[3] = "00";
            for (; i < strlen(text); i += 2)
            {
                sprintf(ch, "%c%c", text[i], text[i+1]);
                buff << strtol(ch, NULL, 16);
            }
            buff << '\0';
            textLen = buff.str().size() + encdec;
            outBuff = (char*)malloc(textLen);

            cout << buff.str().c_str() << endl;
            //buff << '\0';
            gcryError = gcry_cipher_decrypt(hd, outBuff, textLen, buff.str().c_str(), textLen);


где const char* text 16тиричная строка.
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681532
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverinгде const char* text 16тиричная строка.
полученная в предыдущем случае
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681604
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
wolverinа не подскажете как сделать обратную операцию? sscanf или strtoul
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681717
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?sscanf или strtoul
либо не правильно применяю вместо strtol, либо ошибка не в этом у меня
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681831
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverinmaytonА чё просто не написать?
Код: plaintext
1.
printf("%02X", (unsigned char)outBuff[i]);


потому что мне надо не в stdout, а в сокет ответить.
Карамба! Почему в сях нету
Код: plaintext
1.
sockprintf(socket,"%02X", (unsigned char)outBuff[i]);

!!!!
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681845
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причём тут це???
В хрюниксах (стандартный) ввод-вывод может работать на любых (файловых) дескрипторах, включая сокеты. Там (и только там) ваша хотелка имеет право на жизнь.
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681891
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда может автору поможет fprintf ?
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681904
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Меня опять терзают смутные сомнения", что у него - *nix.
А "портабельный" вариант только один - получить требуемое в виде строк/массива байт и работать через сокеты "как все".
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681933
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovПричём тут це???
В хрюниксах (стандартный) ввод-вывод может работать на любых (файловых) дескрипторах, включая сокеты. Там (и только там) ваша хотелка имеет право на жизнь.
не ну так мне кажется изврат будет на libfcgi
Код: plaintext
1.
FCGX_FPrintF(request.out, "%02X", (unsigned char)outBuff[i]);


хотелось бы не привязывать одно к другому то и не шифровать напрямую в сокет.
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38681997
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverin,
Другой вопрос - а зачем вам в С++ malloc?
Вам что мало проблем с алгоритмами, так вы еще проблемы с утечками памяти хотите? :)
Используйте стандартные контейнеры - std::vector, std::string.


Касательно декодирования из потока hex, то простого способа нет.
Надо читать по 2 символа из потока и потом ф-ей sscanf(hex, "%02x", &n) побайтово получать код и записывать в буфер.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    stringstream s;
    s.str("313435");
    string out;
    string tmp;
    while (s >> setw(2) >> tmp) {
        unsigned ch;
        sscanf(tmp.c_str(), "%02x", &ch);
        out += (char)ch;
    }
    cout << out << endl;



Хотя судя по примеру выше, у вас исходная hex строка не в потоке а в обычном массиве. Тогда просто цикл по этому массиву по 2 символа и sscanf
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38682238
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

стандартные контейнеры не могу, тк пользую функции из libgcrypt шифрования/дешифрования gcry_cipher_encrypt/gcry_cipher_decrypt, которые требуют unsigned char*, попробую в понедельник через sscanf, похоже у меня еще с самими функциями проблема.
буду вам очень признателен, если сможете посмотреть мой вопрос
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38682344
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverinстандартные контейнеры не могу, тк пользую функции из libgcrypt шифрования/дешифрования gcry_cipher_encrypt/gcry_cipher_decrypt, которые требуют unsigned char*
Не вижу связи.
Стандартные контейнеры предоставляют указатель на буфер в любой момент.

Код: plaintext
1.
2.
3.
std::vector<unsigned char> buf;
buf.resize(123); // выделяем память
func(buf.data());  // читаем или заполняем - data() - возвращает указатель на начало данных 
...
Рейтинг: 0 / 0
Как в stringstream сделать %02X
    #38682429
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverinсамими функциями проблема.
посмотреть мой вопрос

Там вместо
Код: plaintext
1.
gcry_cipher_open(&hd, GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CBC, GCRY_CIPHER_CBC_CTS);


напиши
Код: plaintext
1.
gcry_cipher_open(&hd, GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_ECB, GCRY_CIPHER_CBC_CTS);


Просто внимательней почитать мануал по libgcrypt.
И c ключом там как? Ключом должен быть массив в 16 байт для AES128.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в stringstream сделать %02X
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]