首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言將多個unsigned long數組合併為字節數組:大端序字節序列化

     編輯:C 語言問答

問題重述

有 unsigned long a[4](每佔 4 字節,共 16 字節 = 128 位),需按大端序(高位字節在前)拼接到 unsigned char b[16]。
例:a[0]=0x12345678 → b[0..3] = {0x12, 0x34, 0x56, 0x78}。

核心代碼(位移提取法)

#include <stdio.h>
#include <stdint.h> // 使用 uint32_t 明確 4 字節

void pack_be(const uint32_t *src, int count, uint8_t *dst) {
    for (int i = 0; i < count; ++i) {
        uint32_t val = src[i];
        // 大端序:高字節先存
        dst[4*i + 0] = (val >> 24) & 0xFF;
        dst[4*i + 1] = (val >> 16) & 0xFF;
        dst[4*i + 2] = (val >> 8)  & 0xFF;
        dst[4*i + 3] =  val        & 0xFF;
    }
}

int main(void) {
    uint32_t a[4] = {0x12345678, 0x87654321, 0xABCDEF00, 0x00FEDCBA}; // 修正示例值
    uint8_t b[16];
    pack_be(a, 4, b);

    printf("b = ");
    for (int i = 0; i < 16; ++i) printf("%02X", b[i]);
    puts("");
    // 輸出: 1234567887654321ABCDEF0000FEDCBA
    return 0;
}

關鍵點解析

  • 大端序:網絡字節序、人類閱讀習慣,高位在低地址。
  • 位移操作:(val >> 24) & 0xFF 取最高字節,依次右移 16、8、0 位取後續字節。
  • 類型選擇:用 uint32_t/uint8_t(<stdint.h>)明確寬度,避免 unsigned long 在 64 位系統上為 8 字節導致邏輯錯誤。
  • 無指針版本:僅使用下標訪問,符合「盡量不用指針」要求。

小端序對比(僅供參考)

// 小端序:低字節在前 (x86 默認)
dst[4*i + 0] =  val        & 0xFF;
dst[4*i + 1] = (val >> 8)  & 0xFF;
dst[4*i + 2] = (val >> 16) & 0xFF;
dst[4*i + 3] = (val >> 24) & 0xFF;

跨平台通訊必須統一字節序,推薦統一用大端序(網絡序)或使用 htonl/ntohl 轉換。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved