簡體   English   中英

將uint64_t數據類型存儲在C中的聯合中存在的char類型字段中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM