Сразу прошу прощения за форматирование: в предпросмотре всё почему-то выровнялось по центру, и я не нашёл кнопки, которая сделает привычное выравнивание по левому краю
Есть у меня буфер с байтами. Вот такой:
char buf[BUF_SIZE]; // Тут идут байты: 0xAA, 0xBB, 0xCC...
А надо — сделать текстовый файл (для одной вредной приблуды):
AA (0D, 0A — два символа перевода строки)
BB
CC
и так далее.
На первый взгляд, одно в другое преобразуется простейшей программой на чистом С (под рукой был только он):
#define DSK_BUF_SIZE 512
#define STR_SIZE 4
//...
void Proc(void)
{
char buf[BUF_SIZE]; // Тут идут байты: 0xAA, 0xBB, 0xCC...
char str[STR_SIZE]; // Тут будет строчка для записи на диск
int i, tmpchar; // Счётчик цикла и временная переменная - для наглядности
DWORD tmp; // Вспомогательная переменная
// ...
// Открываю файлы, читаю буфер с диска, тут всё в порядке.
// ...
// А дальше - начинаю преобразовывать.
for (i = 0; i < BUF_SIZE; i++)
{
tmpchar = buf[i]; // ОШИБКА!!!!
snprintf(str, 3, "%x", tmpchar);
str[2] = 0x0d; // Вообще-то костыль, но пусть будет.
str[3] = 0x0a;
WriteFile(hFile, &str, STR_SIZE, &tmp, NULL); // Функция Windows API
}
}
И вот тут случился затык на выделенной строке — там, где большими буквами написано ОШИБКА!!!. tmpchar — целое число в 4 байта. В первом проходе цикла она была равна 0, а потом в неё попал первый символ буфера, и она стала равна 0x00_00_00_aa — всё в порядке, так и надо. А вот во втором проходе цикла в неё должна попасть величина 0x00_00_00_bb — а попадает постоянно 0xff_ff_ff_bb! Почему-то отрицательное число. Весь вечер долбался, мозги уже работать отказывались, поэтому воткнул туда следующий костыль:
tmpchar = buf[i]; // ОШИБКА!!!!
tmpchar &= 0xff; // Жуткий костыль!!!
snprintf(str, 3, "%x", tmpchar);
В таком виде — вроде заработало. Просветите меня, знающие люди, как всё-таки выглядит "правильный ответ"?