在windows下C中数据的字节表示。 Big-endian&little endian
问题描述:
我有一些C代码,读了一些“fread”,但结果不是我所期望的。这里是我的代码:在windows下C中数据的字节表示。 Big-endian&little endian
void main()
{
unsigned int *data =(unsigned int*)malloc(4);
static unsigned int ImageData[256][256];
char *filename= "C:\\Users\\Frank\\Documents\\Visual Studio 2012\\Projects\\UI\\UI\\bin\\Debug\\bin\\result.txt";
FILE *pfile=fopen(filename,"rb");
for (int i = 0; i < 256; i++)
for (int j = 0; j < 256; j++)
{
fread(data, 4, 1, pfile);
ImageData[i][j] =(*data);
}
fclose(pfile);
printf("\nsize=%d",sizeof(unsigned int));
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
{
printf("\npixel[%d,%d]=%d",i,j,ImageData[i][j]);
}
}
我所期待的十六进制是:
38 FC 0D 13 38 A7 D4 92 38 1F 32 B3 38 blabla...
答
两个主要问题:
-
经常检查相关的系统调用的结果,通常是如果你依靠他们的结果。
FILE *pfile=fopen(filename,"rb");
应该是
FILE *pfile=fopen(filename,"rb"); if (NULL == pfile) { fprintf(stderr, "%s failed to open.\n", filename); }
-
当打印一个
unsigned int
使用%u
转换说明。所以这
printf("\npixel[%d,%d]=%d", i, j,ImageData[i][j]);
应该
printf("\npixel[%d,%d]=%u", i, j, ImageData[i][j]);
一些小问题:
-
的C-标准定义
main()
返回int
。所以这
void main()
应该
int main()
甚至更好
int main(void)
无需投用C
malloc/calloc/realloc
的结果,也不是在任何建议办法。-
另外
malloc()
可能会失败。这样做
data = malloc(4); if (NULL == data) { /* Log error and probably exit ... */ }
-
fread()
可能会失败,以及测试及其结果。if (1 != fread(..., 4, 1, pfile)) { /* read less then expected */ }
的优选数据类型来测量存储器和索引数组是
size_t
不int
。在这种情况下不需要负值。
一些最后提示:
-
如果你知道你需要读32个值(4个字节),确保正确定义的变量。
#include <inttypes.h> /* for u/int32_t */ uint32_t ImageData[256][256];
-
不需要动态分配临时读缓冲区。
只要定义
uint32_t data;
,并使用它像这样
if (1 != fread(&data, 4, 1, pfile)) { ... ImageData[i][j] = data;
或者直接入读阵列
if (1 != fread(&ImageData[i][j], 4, 1, pfile)) { ...
答
反正这是一个大和little endian问题。随之而来的是它。
ImageData[i][j] =_byteswap_ulong(ImageData[i][j]);
谢谢大家。
“我无法发布图片,因为我没有10个声望。有人告诉我为什么吗?”因为你没有10个声望?赚取它! – Nidhoegger
因此,很少有东西 - 首先在互联网上,过去20多年来,全面考虑了YELLING。对你要求帮助的人大声喧哗通常是不礼貌的。接下来说“输出不正确”,但没有告诉我们预期的输出,也没有告诉我们预期的输出,也没有告诉我们输出的结果是否真的很难帮助。最后,你对文件内容的描述使我感到困惑。您需要提供更多信息。 – dman2306
为什么4?最好使用'unsigned int * data = malloc(sizeof * data);' – chux