Есть функция, которая выводит hex C-строку, может есть более правильный способ?
void outHexByCout(const char * cha, int len)
{
for (size_t i = 0; i < len; ++i)
{
cout << setw(2) << setfill('0') << hex << static_cast<uShort>(cha[i]) << " ";
}
cout << endl;
}
Пример вывода:
00 1f ff80 00 00 00 03 ffac 00 15 5b 30 33 2d 32 38 20 32 31 3a 35 37 3a 31 30 3a 31 30 30 5d 00
Что нужно:
00 1F 80 00 00 00 03 AC 00 15 5B 30 33 2D 32 38 20 32 31 3A 32 31 3A 30 30 3A 31 30 30 5D 00
Почему приписывает ff? Например, вот эту строчку получил
ff80 00 00 00
таким образом:
...
writeSESS(128);
...
void writeSESS(uint32_t ses)const
{
// const char* m_buffer
memcpy(const_cast<char*>(m_buffer + 2, (char*)&ses, sizeof(uint32_t));
}
Ваш компилятор в соответствии с установленными опциями рассматривает тип char аналогично типу signed char, поэтому при приведении типов знаковый бит объекта распространяется на старшие биты результирующего выражения.
Сравните.
#include <iostream>
#include <iomanip>
int main()
{
char c = '\x80';
std::cout << std::hex << static_cast<unsigned short>( c ) << std::endl;
std::cout << std::hex << static_cast<unsigned short>( static_cast<unsigned char>( c ) ) << std::endl;
return 0;
}
Вывод программы
ff80
80
Вам надо сначала объект типа char преобразовывать в объект типа unsigned char, а лишь затем в тип unsigned short или short
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники