在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... 
+3

“我无法发布图片,因为我没有10个声望。有人告诉我为什么吗?”因为你没有10个声望?赚取它! – Nidhoegger

+2

因此,很少有东西 - 首先在互联网上,过去20多年来,全面考虑了YELLING。对你要求帮助的人大声喧哗通常是不礼貌的。接下来说“输出不正确”,但没有告诉我们预期的输出,也没有告诉我们预期的输出,也没有告诉我们输出的结果是否真的很难帮助。最后,你对文件内容的描述使我感到困惑。您需要提供更多信息。 – dman2306

+0

为什么4?最好使用'unsigned int * data = malloc(sizeof * data);' – chux

两个主要问题:

  1. 经常检查相关的系统调用的结果,通常是如果你依靠他们的结果。

    FILE *pfile=fopen(filename,"rb"); 
    

    应该是

    FILE *pfile=fopen(filename,"rb"); 
    if (NULL == pfile) 
    { 
        fprintf(stderr, "%s failed to open.\n", filename); 
    } 
    
  2. 当打印一个unsigned int使用%u转换说明。

    所以这

    printf("\npixel[%d,%d]=%d", i, j,ImageData[i][j]); 
    

    应该

    printf("\npixel[%d,%d]=%u", i, j, ImageData[i][j]); 
    

一些小问题:

  1. 的C-标准定义main()返回int

    所以这

    void main() 
    

    应该

    int main() 
    

    甚至更​​好

    int main(void) 
    
  2. 无需投用C malloc/calloc/realloc的结果,也不是在任何建议办法。

  3. 另外malloc()可能会失败。

    这样做

    data = malloc(4); 
    if (NULL == data) 
    { 
        /* Log error and probably exit ... */ 
    } 
    
  4. fread()可能会失败,以及测试及其结果。

    if (1 != fread(..., 4, 1, pfile)) 
    { 
        /* read less then expected */ 
    } 
    
  5. 的优选数据类型来测量存储器和索引数组是size_tint。在这种情况下不需要负值。

一些最后提示:

  1. 如果你知道你需要读32个值(4个字节),确保正确定义的变量。

    #include <inttypes.h> /* for u/int32_t */ 
    
    uint32_t ImageData[256][256]; 
    
  2. 不需要动态分配临时读缓冲区。

    只要定义

    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]); 

谢谢大家。