1

我有一个结构:

//GUID structure
typedef struct {
    var8 octet[16];
} GPTGUID_t;

和一个很长的#define 为:

#define PTYPE_MRP_UPPER     0x4db80b5ce3c9e316ULL
#define PTYPE_MRP_LOWER     0xae1502f02df97d81ULL

我希望在八位字节 0 到 7 中复制 UPPER 部分,在 8 到 15 中复制 LOWER 部分。不幸的是,包括 memcpy 在内的所有尝试都失败并给出了段错误。

我尝试了一些方法:

        strcpy(guid.octet[0], PTYPE_MRP_UPPER);
        strcpy(guid.octet[8], PTYPE_MRP_LOWER);

并且,

memcpy(guid.octet[0], PTYPE_MRP_UPPER, sizeof(PTYPE_MRP_UPPER));
memcpy(guid.octet[8], PTYPE_MRP_LOWER, sizeof(PTYPE_MRP_LOWER));

两者都失败了。

顺便说一句:

typedef unsigned char       var8;
typedef unsigned short      var16;
typedef unsigned int        var32;

但是,我能够将单个八位组提取为:

    memcpy( guid.octet, pHdr->partTypeGUID, sizeof(GPTGUID_t));//copy the partitionTypeGUID
    p1 = getvar64(guid.octet[0]);
    p2 = getvar64(guid.octet[8]);

在哪里,#define getvar64(x) (*(var64*)(&x))

4

4 回答 4

6

该值0x4db80b5ce3c9e316ULL不是字符串,因此strcpy将其视为指针,并且具有这样的值,它指向错误

strcpy在找到零字节(字符)之前,您也不能在复制时使用它'\0'。改为使用memcpy

您也不会传递指向函数的指针,memcpy而是传递值。您应该打开更多警告,因为编译器不会喜欢它,但显然不足以使其成为错误。

尝试这样调用memcpy

unsigned long long val;

val = PTYPE_MRP_UPPER;
memcpy(&guid.octet[0], &val, sizeof(val));
val = PTYPE_MRP_LOWER;
memcpy(&guid.octet[8], &val, sizeof(val));
于 2012-10-09T14:47:34.663 回答
1

这些不是内存部分,这些是数字:为什么不使用掩码?

int i;
unsigned long long mask = 0xff00000000000000;
for (i = 0; i < 8; i++)
{
  guid.octet[i] = (PTYPE_MRP_UPPER & mask) >> ((7 - i) * 8);
  guid.octet[i+8] = (PTYPE_MRP_LOWER & mask) >> ((7 - i) * 8);
  mask >>= 8;
}
于 2012-10-09T14:53:15.737 回答
0

您可以使用联合:

//GUID structure
typedef struct {
    union {
        var8 octet[16];
        uint64_t qword[2];
    };
} GPTGUID_t;

// This copies the bytes in native-endian order; do an endian swap if you need
// non-native order
guid.qword[0] = PTYPE_MRP_UPPER;
guid.qword[1] = PTYPE_MRP_LOWER;

请注意,这是一个匿名联合,它是 C11 语言标准的一个特性,但它也在许多 C89/C99 编译器中作为语言扩展实现;如果您的编译器不支持这一点,那么您必须改用命名联合。

或者,如果您不能或不想修改 的定义GPTGUID_t,您应该一次只复制一个字节:

// This stores the bytes in big-endian order
guid.octet[0] = (var8)(PTYPE_MRP_UPPER >> 56);
guid.octet[1] = (var8)(PTYPE_MRP_UPPER >> 48);
guid.octet[2] = (var8)(PTYPE_MRP_UPPER >> 40);
guid.octet[3] = (var8)(PTYPE_MRP_UPPER >> 32);
guid.octet[4] = (var8)(PTYPE_MRP_UPPER >> 24);
guid.octet[5] = (var8)(PTYPE_MRP_UPPER >> 16);
guid.octet[6] = (var8)(PTYPE_MRP_UPPER >> 8);
guid.octet[7] = (var8)(PTYPE_MRP_UPPER);
guid.octet[8] = (var8)(PTYPE_MRP_LOWER >> 56);
guid.octet[9] = (var8)(PTYPE_MRP_LOWER >> 48);
guid.octet[10] = (var8)(PTYPE_MRP_LOWER >> 40);
guid.octet[11] = (var8)(PTYPE_MRP_LOWER >> 32);
guid.octet[12] = (var8)(PTYPE_MRP_LOWER >> 24);
guid.octet[13] = (var8)(PTYPE_MRP_LOWER >> 16);
guid.octet[14] = (var8)(PTYPE_MRP_LOWER >> 8);
guid.octet[15] = (var8)(PTYPE_MRP_LOWER);
于 2012-10-09T14:49:31.650 回答
-2

0x4db80b5ce3c9e316ULL 和 0xae1502f02df97d81ULL 究竟是什么?似乎您在特定地址随机复制数据。

顺便说一句,如果你真的在处理字符串,

#define PTYPE_MRP_UPPER     "0x4db80b5ce3c9e316ULL"
#define PTYPE_MRP_LOWER     "0xae1502f02df97d81ULL"

应该做的伎俩。(即使我不知道你真正想用这些值做什么)

于 2012-10-09T14:47:43.987 回答