[英]Storing a uint64_t data type in a char type field present in a union in C
嗨,我有以下聯合,它是較大結構的一部分,我想在此聯合中存儲uint64_t(64位大小)數據。 但是我想通過訪問id_data字段來存儲它,因為其他的大小不足以容納完整的uint64_t。 但是我不知道如何將我的uint64_t數據分配到此id_data字段中。
我知道如何從該字段讀取uint64_t數據,但是不知道如何為它分配值。
任何幫助將不勝感激。
謝謝。
union {
struct id_ts { /* ICMP Timestamp */
uint32_t otime; /* Originate */
uint32_t rtime; /* Receive */
uint32_t ttime; /* Transmit */
} id_ts;
struct id_ip {
struct xyz_abc idi_ip;
/* options and then 64 bits of data */
} id_ip;
struct ra_addr id_radv;
uint32_t id_mask;
char id_data[1];
} icmp_nnn;
您可以使用memcpy
:
uint64_t val;
memcpy((void*)&icmp_nnn.id_data[0], (void*)&val, sizeof(val));
您並沒有真正將其分配給id_data
成員。 只是memcpy
到由工會使用的內存空間。 id_data[0]
將對應於union
的開始 。
錯誤...為什么不只是讓您可以分配給工會的uint64_t成員?
如所寫,您不能將其寫入id_data字段,因為該字段只有一個字節長。 實現定義了使用比我認為更多的空間。
就是說,您對聯合所做的幾乎所有事情都是實現定義的,因此,如果您要使用討厭的,討厭的,總瘋狂的,平台依賴的方式來執行此操作,則可以使用移位來獲得期望的效果。 請注意,您可能需要更改
size_t idx = 0;
uint64_t myData = /* ... */;
union icmp_nnn structure;
for (; idx < 8; ++idx)
{
// For big endian machines
structure.id_data[idx] = (myData >> 8*idx) & 0xFF;
// For little endian machines
structure.id_data[7-idx] = (myData >> 8*idx) & 0xFF;
}
比利3
如果您不能更改union
聲明,則memcpy
應該仍然允許您執行所需的操作。
您為什么不能聲明聯合的uInt64_t成員是有原因的?
您說您知道如何從id_data字段讀取uint64_t數據嗎? 你到底是怎么做到的? get應該與set沒有太大不同嗎?
要從現場閱讀:
uint64_t ui = *(uint64_t*)icmp_nnn.id_data;
寫實地;寫實地
*(uint64_t*)icmp_nnn.id_data = 12345;
但是,實際上,如果它是您自己的代碼(即不是庫),則應該只向聯合添加一個uint64_t成員。
您應該使用memcpy()
,但實際上沒有理由將id_data
字段用作目標-只需使用整個聯合本身即可,這更清楚地表達了您的意圖。
uint64_t src;
memcpy(&icmp_nnn, &src, sizeof src);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.