反转 void 数组和要转换成的数据类型

Reversing void array & what datatype to cast to

我已经为这样的数组分配了内存:

void *buf;
buf = calloc(8192, 1);

现在我从原始文件的文件流中读取 8192 字节到数组:

uint32_t fpos = 0;
int n;
n = fread(buf,1,8192,file);
fpos += n;

我会使用这样的函数:

static void reverseBuffer(void *buf){
        for(int a = 0; a < sizeof(buf)>>1; a++){
            uint8_t temp = (uint8_t) buf[a];
            buf[a] = buf[sizeof(buf) - a - 1];
            buf[sizeof(buf) - a - 1] = temp;
        }
} 

显然它并没有真正起作用,我需要如何转换数组以及我需要使用什么数据类型?我尝试将其转换为 uint_8,因为它保证大小为 1Byte。

干杯

在你的循环中,也许 sizeof(buf)>>1 而不是 sizeof(buf)>>2 会让你的代码工作。

在不知道类型的情况下无法反转数组。

考虑反转数组的含义。我们想要交换第一个和最后一个元素,第二个和倒数第二个元素,依此类推。

[0, 1, 2, 3] => [3, 2, 1, 0]

这是可行的,因为我们知道每个元素的大小。实际上,数据以 1 和 0 的形式存在。

如果我们知道第一个和最后一个元素有多大,我们只能交换第一个和最后一个元素。

// Element size is 3 bits
[000, 001, 010, 100] => [100, 010, 001, 000]

不知道每个元素的大小,就不可能知道第一个元素在哪里停止以及应该交换什么。

// Unknown element size
000001010100

// Element size 1
[0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0] => [0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0]

// Element size 2
[00, 00, 01, 01, 01, 00] => [00, 01, 01, 01, 00, 00]

// Element size 4
[0000, 0101, 0100] => [0100, 0101, 0000]

类型定义一个元素有多少位(例如,int 可能是 32 位,long 可能是 64 位)。

不知道类型就不可能知道元素大小,不知道元素大小就不可能反转列表。

how would I need to cast the array and what data type would I need to use? I tried casting it to uint_8 since its guaranteed to be of size 1Byte.

所以你快到了。

只是您不能解除对 void 指针的引用,因为它指向 void 时不清楚应该评估哪种类型。

解决方案是将 指针 转换为某些特定 指针类型。在你的情况下 uint8_t* 然后才取消引用它。

您的代码还假定 sizeof buf 会给出数组的大小,但事实并非如此。它给你 buf 的大小,因为 buf 是一个指针 (void*) 你得到一个指针的大小,它是 4 或 8 个字节,具体取决于 OS 你是运行这个代码。

因此,您需要让函数知道数组的大小。这可以通过传递它来完成。

函数可能如下所示:

static void reverseBuffer(size_t size, void * buf) {
    for (size_t a = 0; a < size >> 1; a++) {
        uint8_t temp = ((uint8_t*) buf)[a];
        ((uint8_t*) buf)[a] = ((uint8_t*) buf)[size - a - 1];
        ((uint8_t*) buf)[sizeof- a - 1] = temp;
    }
} 

或者引入一个本地正确类型的变量:

static void reverseBuffer(size_t size, void * buf) {
    uint8_t * p = buf;

    for (size_t a = 0; a < size >> 1; a++) {
        uint8_t temp = p[a];
        p[a] = p[size - a - 1];
        p[size - a - 1] = temp;
    }
} 

或者已经使用正确的类型定义函数:

static void reverseBuffer(size_t size, uint8_t * p) {
    for (size_t a = 0; a < size >> 1; a++) {
        uint8_t temp = p[a];
        p[a] = p[size - a - 1];
        p[size - a - 1] = temp;
    }
} 

这样称呼它

  reverseBuffer(8192, buf);