2012-07-17 76 views
0

我在Windows上使用GCC編譯器(codeblocks),而且我得到的數據來自UNIX機器,所以它都是以big-endian表示的。我必須先將它交換成小端,然後才能使用它。我會被阻止,但我無法得到這個工作。使用在C++中字節翻轉數據只返回零值

temp = ntohl(fileBuf[N*i+j]); 

_byteswap_ulong(fileBuf[N*i+j]); 

回報無非是零。我所知道的一個事實是不正確的。

傳入數據只是一串32位整數(美國部分地區的海拔數據)。任何幫助是極大的讚賞

編輯:漂亮的新來的,我不知道如果代碼是

typedef unsigned char BYTE 
int main() 
{ 
    long int temp; 
    int i,j; 
    ofstream myFile; 
    myFile.open("fixed4.txt"); 
    const char *filePath = "input2"; 
    BYTE *fileBuf; 
    FILE *file = NULL; 
    if ((file = fopen(filePath, "rb"))==NULL) 
     cout<< "File could not be opened successfully" << endl; 
    else 
     cout << "File Opened successfully" << endl; 

    long fileSize = getFileSize(file); 
    fileBuf = new BYTE[fileSize]; 
    //BYTE *flipped; 
    //flipped = new BYTE[fileSize]; 

    fread(fileBuf, fileSize, 4, file); 

    for (i=0; i<N; i+=1){ 
     for (j=0; j<N; j+=1){ 
      temp = _byteswap_ulong(fileBuf[N*i+j]); 
      grid[i][j]=binaryToBase10(temp); 

// more code here but it isn't important.... 
+1

'ntohl'是很好測試,所以這似乎是一個合理的猜測,問題是出在你提供的數據到它。你確定'filebuf [N * i + j]'確實是正確的數據嗎? – 2012-07-17 17:35:34

+0

'printf(「%x%x \ n」,fileBuf [N * i + j],ntohl(fileBuf [N * i + j])'並考慮結果 – 2012-07-17 17:37:39

+0

什麼類型是fileBuf?和temp? – marcinj 2012-07-17 17:38:27

回答

2

你不給我們太多的去用,所以這是一個水晶般球猜測。

fileBuf的類型是char*unsigned char*。因此,您傳遞給ntohl的值是位置(i,j)處的單字節,而不是(i,j)處的32位int。

的一種方式(有更好的方法)來解決這個問題是這樣的:

ntohl(*(uint32_t*)&fileBuf[N*i+j]) 
+1

這也可能是未定義的行爲, d更好地讀入一個整數的矢量馬上。 – 2012-07-17 18:31:53