簡體   English   中英

序列化:char和uint32_t的大小

[英]Serialization: size of char and uint32_t

我有多個問題。

  1. 在每個系統上,char的大小是否始終為1(字節)?
  2. 每個系統上uint32_t的大小是否始終為4(字節)?

我寫了兩個小函數來序列化我的結構,但是我不知道這是否是個好方法。

struct udtpackage{
    char version;
    bool eof;
    uint32_t data_size;
    uint32_t encrypted_size;
    char data[BUFFERSIZE+16];
    char hmac[64];
};

void serialize (udtpackage package, unsigned char* buffer){
    uint32_t tmp;

    memcpy(&buffer[0], &package.version, 1);
    (package.eof) ? (buffer[1] = 0xFF) : (buffer[1] = 0x00);
    tmp = htonl(package.data_size);
    memcpy(&buffer[2], &tmp, 4);
    tmp = htonl(package.encrypted_size);
    memcpy(&buffer[6], &tmp, 4);
    memcpy(&buffer[10], &package.data[0], BUFFERSIZE+16);
    memcpy(&buffer[10+BUFFERSIZE+16], &package.hmac[0], 64);
}

void deserialize (udtpackage* package, unsigned char* buffer){
    uint32_t tmp;

    memcpy(&package->version, &buffer[0], 1);
    (buffer[1] & 0xFF) ? (package->eof = true) : (package->eof = false);
    memcpy(&tmp, &buffer[2], 4);
    package->data_size = ntohl(tmp);
    memcpy(&tmp, &buffer[6], 4);
    package->encrypted_size = ntohl(tmp);
    memcpy(&package->data[0], &buffer[10], BUFFERSIZE+16);
    memcpy(&package->hmac[0], &buffer[10+BUFFERSIZE+16], 64);
}
  1. 是。 char的大小始終為1。但這並不意味着每個字節有8位。

  2. 否。例如,實現可以定義每個字節32位,
    那么uint32_t的大小將為1。如果是這種情況,則不會定義某些固定寬度類型。

這是一個潛在的問題:

memcpy(&buffer[2], &tmp, 4);    
                         ^

正如我在第二點提到的那樣,代碼應為:

memcpy(&buffer[2], &tmp, sizeof(tmp));
                         ^

更進一步,緩沖區偏移也應固定,否則可能會浪費內存:

memcpy(&buffer[6], &tmp, 4);
               ^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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