我有一个结构:
//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))
答案 0 :(得分:5)
值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));
答案 1 :(得分: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;
}
答案 2 :(得分: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编译器中实现为语言扩展;如果您的编译器不支持,那么您必须改为使用命名的union。
或者,如果您不能或不想修改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);
答案 3 :(得分:-2)
实际上是0x4db80b5ce3c9e316ULL和0xae1502f02df97d81ULL? 似乎您在特定地址随机复制数据。
顺便说一句,如果你实际上正在处理字符串,
#define PTYPE_MRP_UPPER "0x4db80b5ce3c9e316ULL"
#define PTYPE_MRP_LOWER "0xae1502f02df97d81ULL"
应该做的伎俩。 (即使我不知道你真正想用这些价值做什么)