有 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 轉換。