如何从指针读取64位到8位值

时间:2016-02-26 19:17:13

标签: c arrays pointers indexing casting

我创建了一个表示虚拟内存的数组,并且对此数组有一个uint8_t *。我试图一次访问64位,并将其设置为一个值。它只接受第一个字节,我无法弄清楚如何使它占用整个64位。

control->value = memory[pc + 2];

我知道这会将控制值设置为pc + 2的存储器阵列(64位的开头我想读入)

我只是不知道如何让这些代码以64位进入控制 - > value(a uint64_t)

3 个答案:

答案 0 :(得分:3)

最干净的方法是一次读取一个字节,然后移动并将值移入。

如果MSB是第一个:

control->value = (uint64_t)memory[pc + 2] << 56;
control->value |= (uint64_t)memory[pc + 3] << 48;
control->value |= (uint64_t)memory[pc + 4] << 40;
control->value |= (uint64_t)memory[pc + 5] << 32;
control->value |= (uint64_t)memory[pc + 6] << 24;
control->value |= (uint64_t)memory[pc + 7] << 16;
control->value |= (uint64_t)memory[pc + 8] << 8;
control->value |= (uint64_t)memory[pc + 9];

如果LSB是第一个:

control->value = (uint64_t)memory[pc + 2];
control->value |= (uint64_t)memory[pc + 3] << 8;
control->value |= (uint64_t)memory[pc + 4] << 16;
control->value |= (uint64_t)memory[pc + 5] << 24;
control->value |= (uint64_t)memory[pc + 6] << 32;
control->value |= (uint64_t)memory[pc + 7] << 40;
control->value |= (uint64_t)memory[pc + 8] << 48;
control->value |= (uint64_t)memory[pc + 9] << 56;

铸造是必要的,以确保左移不会脱离边缘&#34;

答案 1 :(得分:0)

如下所示,您可以使用uint8_t*

访问64位值
int main()
{
    uint64_t value = 100000000000;
    printf("%lld\n",value);
    uint8_t* ptr = (uint8_t*)&value;     
    printf("%lld\n",*((uint64_t*)(ptr)));//While accessing the value you need typecast it back to uint64_t type.
    return 0;
}

希望这有帮助。

答案 2 :(得分:0)

考虑以下计划:

#include <stdio.h>
#include <stdint.h>
struct some_struct{
    uint64_t value;
};
int main(void){
    uint64_t memory[10] = {111111111,22222222,0x1111111111111111,444444444,5,6,7,8,9,20};
    struct some_struct *control = malloc(sizeof(struct some_struct));
    int pc = 0;

    control->value = memory[pc+2];
    fprintf(stderr, "ptr = %llu, %llu\n", control->value, memory[2]);
}

这里我试图访问作为数组的“内存”的第3个元素 64位整数。
希望这会有所帮助。