1

编辑:在做了更多研究之后,似乎我真正需要的是大端到中端,反之亦然。所以 12345678 -> 34127856 并返回。很抱歉有任何混淆。

我有一个小文件,正好 16MB。我正在将整个文件读入缓冲区。如果可能的话,我试图做的是一次性对整个文件/缓冲区进行字节交换(例如,统一/全局交换 ADDECEFA => DEADFACE)。我已经阅读了无数页的字节交换,但是由于某种原因,很多按位/字节交换的东西都在我头上(很可能是愚蠢的大脑)。如果有人知道傻瓜的按位/字节交换,请指出我正确的方向!

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) 
{

    const char * suffix = ".reversed";

    FILE *input = fopen(argv[1], "rb");
    char * out = strcat(argv[1], suffix);
    FILE *output = fopen(out, "wb");

    int data[16384];
    int swapped;

 while(fread(data,sizeof data, 1, input)){

    swapped = ((data & 0x000000FF) << 24) |
              ((data & 0x0000FF00) <<  8) |
              ((data & 0x00FF0000) >>  8) |
              ((data & 0xFF000000) >> 24);

    fwrite(swapped, sizeof data , 1, output);

            /*  by golly it copies the file fast as heck!
                but i am unsure how to manipulate 'data' buffer
                so as it uniformly/globaly swaps ADDECEFA => DEADFACE 
            */
        }
    }

另外,如果你看到我在我的代码中做错了什么,请告诉我并告诉我一个更好的方法。如果您需要我详细说明任何事情,请不要犹豫。谢谢,祝你好运。

编辑:我添加了我失败的尝试之一。我的最终目标是在将字节写回 outfile 时交换字节并尽可能有效地交换它们。

4

1 回答 1

1

给定

int data[16384];

这段代码

while(fread(data,sizeof data, 1, input)){

将尝试从中读取 16,384 个intinput。到目前为止没有任何问题。

但是这段代码:

swapped = ((data & 0x000000FF) << 24) |
          ((data & 0x0000FF00) <<  8) |
          ((data & 0x00FF0000) >>  8) |
          ((data & 0xFF000000) >> 24);

将尝试将适合字节交换地址的任何部分填充data到中swapped,因为data被评估为数组第一个元素的地址。

你可能想要这样的东西:

swapped = ((data[ 0 ] & 0x000000FF) << 24) |
          ((data[ 0 ] & 0x0000FF00) <<  8) |
          ((data[ 0 ] & 0x00FF0000) >>  8) |
          ((data[ 0 ] & 0xFF000000) >> 24);

但这有一个问题,即转换有符号 int值具有实现定义的行为。请参阅有符号整数上的算术位移

所以你可能想要

unsigned int data[16384];

但是,即使考虑到这一点,您也只是交换了一个int值。您需要遍历所有已读取的数据,交换每个int,假设这是您想要做的。

这引发了另一个问题 - 您的代码不跟踪字节交换所需的数据量。您需要计算int读入的值的数量并使用它。

最后,这段代码

fwrite(swapped, sizeof data , 1, output);

将从所指向的地址开始写入sizeof data字节。但这是 的定义:outputswappedswapped

int swapped;

所以那个fwrite()调用是未定义的行为。

于 2016-12-14T21:58:09.523 回答