Чтение в сырых файлах C ++ - PullRequest
0 голосов
/ 09 декабря 2011

Как данные сохраняются при чтении с использованием fstream class? Пример прояснит мой вопрос:

    char * memBlock = NULL;
    fileSize = file.tellg();
    memBlock = **new** char[fileSize];
    file.seekg(0, ios::beg);
    file.read(memBlock, fileSize);
    file.close();

    if(memBlock)
    return memBlock;

Контекст заключается в том, что я читаю необработанное изображение, которое было записано в шестнадцатеричном формате, так что

  • значения, представляющие пиксели, являются либо 00, либо ff (черный или белый, 1 или 0)
  • и расположены в столбцах и строках.

При чтении файла в памяти сохраняются ли значения в memblock array как ff и 00 или они автоматически конвертируются в 1 и 0 с помощью ASCII или чего-то еще?

Ответы [ 2 ]

0 голосов
/ 09 декабря 2011

Для чтения файла необработанных данных сначала необходимо открыть файлы в двоичном режиме, что не является значением по умолчанию для fstream. Используйте file.open(filename, std::ios::binary|std::ios::in).

Таким образом, содержимое, считываемое в буфер памяти, будет точно таким же, как содержимое файла.

Так что, если у вас есть 00ff00ff в файле, у вас будет 00ff00ff в вашей памяти. Там не будет никакого преобразования.

Если вы хотите преобразовать его в 0 и 1, предполагая, что с 00ff00ff, вы подразумеваете, что каждый байт равен 0x00, 0xff, 0x00, 0xff, вы можете выполнить следующее преобразование: (если 00ff00ff на самом деле это восемь символов ASCII, см. ответ Эсскара)

for (size_t i=0; i<fileSize; i++)
{
    if (memBlock[i]!=0) memBlock[i]=1;
    // or
    // memBlock[i] &= 1;
}

Это преобразует буфер в последовательные двоичные файлы 0 и 1 байтов.

0 голосов
/ 09 декабря 2011

Когда данные хранятся в шестнадцатеричном виде

00FF00FF

и вы читаете его, используя file.read, как показано в вашем коде, затем он сохраняется как то, что означает, что

memcmp(memblock, "00FF00FF", 8) == 0

оценит как истинное.

EDIT

Вы должны сделать преобразование самостоятельно. Одним из способов будет

int ConvertToColor(const char *colorBuffer, size_t size)
{
    int color = -1;
    if(size >= 2)
    {
        char colorCode[3] = { colorBuffer[0], colorBuffer[1], 0 };
        long longColor = strtol(colorCode, NULL, 16);
        if(longColor != LONG_MAX && longColor != LONG_MIN)            
            color = (int)longColor;

    } 
    return color;   
}

std::vector<int> ConvertToColors(const char *memBlock, size_t size)
{
    std::vector<int> colors;
    for(size_t i = 0; i < size; i += 2)
    {
        int color = ConvertToColor(memBlock + i, size - i);
        if(color < 0)
            throw std::exception("Unable to convert color.");
        colors.push_back(color ? 1 : 0);
    }
    return colors;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...