为什么 strtoul 从“1”字符串返回 0?
Why is strtoul returning 0 from a "1" string?
我正在尝试以一种在没有 GDAL 库的情况下易于阅读的方式压缩光栅文件(我的网络服务器无法安装 GDAL)。在 this question 之后,我正在执行以下操作以将栅格的字节(仅 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 值,这被传递给返回 0 的 strtoul。显然我在弄乱某些东西(可能是指针),但找不到位置。我做错了什么?
strtoul
用于将可打印字符数据转换为整数。该字符串应包含数字的字符代码,例如'0'
、'1'
等
显然在您的情况下,源数据实际上是整数值 1
因此 strtoul
发现没有预期形式的字符和 returns 0
。
我正在尝试以一种在没有 GDAL 库的情况下易于阅读的方式压缩光栅文件(我的网络服务器无法安装 GDAL)。在 this question 之后,我正在执行以下操作以将栅格的字节(仅 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 值,这被传递给返回 0 的 strtoul。显然我在弄乱某些东西(可能是指针),但找不到位置。我做错了什么?
strtoul
用于将可打印字符数据转换为整数。该字符串应包含数字的字符代码,例如'0'
、'1'
等
显然在您的情况下,源数据实际上是整数值 1
因此 strtoul
发现没有预期形式的字符和 returns 0
。