2015-09-05 126 views
-5

我有一些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

兩個主要問題:

  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)) 
    { 
        ... 
    
0

反正這是一個大和little endian問題。隨之而來的是它。

ImageData[i][j] =_byteswap_ulong(ImageData[i][j]); 

謝謝大家。