Затык с преобразованием типов
От: TheMaster  
Дата: 07.04.15 04:56
Оценка: -1 :)
Сразу прошу прощения за форматирование: в предпросмотре всё почему-то выровнялось по центру, и я не нашёл кнопки, которая сделает привычное выравнивание по левому краю
Есть у меня буфер с байтами. Вот такой:
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);

В таком виде — вроде заработало. Просветите меня, знающие люди, как всё-таки выглядит "правильный ответ"?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.