1

私は次のような構造を持っています:

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

そして長い#defineas:

#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、一度に1バイトずつコピーする必要があります。

// 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 に答える