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

位元組序深度解析:大小端模式與 .NET 類別庫處理策略

     編輯:關於.NET

什麼是位元組序?

多位元組資料在記憶體中儲存順序。以 32 位元整數 0x0A0B0C0D 為例:

  • 大端序:高位元組存低位址 → 0A 0B 0C 0D (網路序、PowerPC)
  • 小端序:低位元組存低位址 → 0D 0C 0B 0A (x86/x64、Intel/AMD)
  • 中端序:罕見 (如 2143 順序)

.NET 核心類別庫處理策略

BinaryReader / BinaryWriter

  • 固定使用小端序讀寫
  • 不可配置
var stream = new MemoryStream(new byte[] { 4, 1, 0, 0 });
var reader = new BinaryReader(stream);
int i = reader.ReadInt32(); // i == 260 (小端序解讀)

BitConverter

  • 行為平台相關,靜態欄位 BitConverter.IsLittleEndian 指示當前平台端序 (編譯期常數)
  • x86/x64 上永遠為 true
public static int ToInt32(byte[] value, int startIndex) {
    fixed (byte* p = &value[startIndex]) {
        if ((startIndex % 4) == 0) return *((int*)p); // 直接記憶體轉型 (依賴平台端序)
        if (IsLittleEndian) return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
        return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
    }
}

Buffer.BlockCopy

  • 複製位元組而非元素
  • 文檔聲明為端序相關,跨平台使用需謹慎

運行時偵測平台端序

static unsafe bool IsLittleEndian() {
    int i = 1;
    byte* b = (byte*)&i;
    return b[0] == 1;
}

// Mono 使用 double 版本
static unsafe bool AmILittleEndian() {
    double d = 1.0; // big: 3F F0 00... / little: 00 00 00... F0 3F
    byte* b = (byte*)&d;
    return b[0] == 0;
}

針對固定端序協定的程式設計模式

東京櫃 (Tokyo Tyrant) 協定要求大端序傳輸,不可直接使用 BitConverter。

手動轉換 (最直觀)

static int ReadInt32(Stream s) {
    var buf = new byte[4]; s.Read(buf, 0, 4);
    return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24); // 大端序讀取
}

利用 BitConverter.IsLittleEndian 判斷轉換

static int ReadInt32(Stream s) {
    var buf = new byte[4]; s.Read(buf, 0, 4);
    if (BitConverter.IsLittleEndian) Array.Reverse(buf);
    return BitConverter.ToInt32(buf, 0);
}

static void WriteInt32(Stream s, int value) {
    var buf = BitConverter.GetBytes(value);
    if (BitConverter.IsLittleEndian) Array.Reverse(buf);
    s.Write(buf, 0, buf.Length);
}

利用 BinaryReader/Writer (固定小端序) 間接實作

讀取時先用 BinaryReader 讀入,再根據需求反轉位元組;寫入時反轉後交給 BinaryWriter。讀者可自行嘗試。

來源

原文:Jeffrey Zhao - 關於位元組序及其相關類庫

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