Почему strtoul возвращает 0 из строки «1»? - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь сжать растровый файл так, чтобы его было легко прочитать без библиотеки GDAL (мой веб-сервер не может установить GDAL).После этого вопроса я делаю следующее, чтобы преобразовать байты растра (только значения 0 и 1) в биты:

int main(int argc,char *argv[]) {
    if (argc < 3) {
        return 1;
    }
    GDALDataset *poDataset;
    GDALAllRegister();
    poDataset = (GDALDataset*)GDALOpen(argv[1],GA_ReadOnly);
    if (poDataset == NULL) {
        return 2;
    }
    int tx=poDataset->GetRasterXSize(), ty=poDataset->GetRasterYSize();
    GDALRasterBand *poBand;
    int nBlockXSize,nBlockYSize;
    poBand = poDataset->GetRasterBand(1);
    printf("Type: %s\n",GDALGetDataTypeName(poBand->GetRasterDataType()));
    // Type: Byte
    poBand->GetBlockSize(&nBlockXSize,&nBlockYSize);
    int i, nX = tx/nBlockXSize, nY = ty/nBlockYSize;
    char *data = (char*)CPLMalloc(nBlockXSize*nBlockYSize + 1);
    uint32_t out[nBlockXSize*nBlockYSize/32];
    char temp;
    CPLErr erro;
    FILE* pFile;
    pFile = fopen(argv[2],"wb");
    for (y=0; y<nY; y++) {
        for (x=0; x<nX; x++) {
            erro = poBand->ReadBlock(x,y,data);
            if (erro > 0) {
                return 3;
            }
            for (i=0; i<nBlockXSize*nBlockYSize; i+=32) {
                temp = data[i+32];
                data[i+32] = 0;
                out[i/32] = strtoul(&data[i],0,2);
                if (data[i] != 0) {
                    printf("%u/%u ",data[i],out[i/32]);
                }
                data[i+32] = temp;
            }
            ch = getchar(); // for debugging
        }
        fwrite(out,4,nBlockXSize*nBlockYSize/32,pFile);
    }
    fclose(pFile);
    CPLFree(data);
    return 0;
}

После считывания первого набора байтов (for (i=0; i<nBlockXSize*nBlockYSize; i+=32)), я вижу, что printf("%u/%u ",data[i],out[i/32]); печатает некоторую "1/0", что означает, что, когда мой растр имеет значение 1, это передается в strtoul, который возвращает 0. Очевидно, я что-то связываю(указатели, вероятно), но не могу найти где.Что я делаю не так?

1 Ответ

0 голосов
/ 03 декабря 2018

strtoul для преобразования печатных символьных данных в целое число.Строка должна содержать коды символов для цифр, например, '0', '1' и т. Д.

Очевидно, в вашем случае исходные данные на самом деле являются целочисленными значениями 1, поэтому strtoul обнаруживает, что символов нетожидаемой формы и возвращает 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...