C ++中的字节翻转数据仅返回零

时间:2012-07-17 17:31:43

标签: c++ gcc endianness

我在Windows上使用GCC编译器(代码块),而我得到的数据来自UNIX机器,所以它都是big-endian。在我能够使用之前,我必须将它换成小端。我会被诅咒,但我不能让这个工作。使用

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 个答案:

答案 0 :(得分:2)

你没有给我们太多的帮助,所以这是一个水晶球猜测。

fileBuf的类型为char*unsigned char*。因此,传递给ntohl的值是位置(i,j)处的单字节,而不是(i,j)处的32位int。

解决这个问题的一种方法(有更好的方法)是:

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