HOWTO · Csharp

如何在 C# 中初始化位元組陣列

了解如何在 C# 中建立特定長度的位元組陣列、設定其值以及複製原始位元組。

本頁內容

C# 的 byte[] 儲存 0 到 255 之間的位元組值。使用 new byte[length] 建立元素最初包含零的陣列,或者在已知值時使用陣列初始化器。迴圈、Array.Fill 和 LINQ 可以分配重複或計算出的值;Buffer.BlockCopy 用於複製已經儲存在陣列中的位元組。

以固定長度或顯式值建立位元組陣列

要建立固定大小的 byte[],請將其長度傳遞給 new byte[length]。執行階段會將每個元素初始化為零。當你預先知道這些值時,請改為將它們寫入初始化器中。當每個值取決於其索引或另一個計算時,迴圈很有用。

下面的宣告並排展示了兩種常見形式。第一種保留四個位置,第二種直接列出三個位元組值。然後迴圈按順序存取每個位置,並根據其索引儲存一個值。Length 提供位置的數量,因此當你變更請求的大小時,相同的迴圈形式可以適應。最後幾行列印兩個陣列,以便你可以比較每種形式產生的值。

using System;

class Program
{
    static void Main()
    {
        byte[] values = new byte[4];
        byte[] explicitValues = { 0x10, 0x20, 0x30 };

        for (int i = 0; i < values.Length; i++)
        {
            values[i] = (byte)(i + 1);
        }

        Console.WriteLine(string.Join(", ", values));
        Console.WriteLine(string.Join(", ", explicitValues));
    }
}
1, 2, 3, 4
16, 32, 48

對於第一個陣列,迴圈儲存 1、2、3 和 4。顯式初始化器建立一個單獨的陣列,其中包含列出的十六進位位元組值。

將每個元素設定為相同的值

當專案的目標框架提供 Array.Fill 時,請使用它。它將一個位元組值分配給指定陣列中的每個元素。如果該 API 在專案中不可用,則對陣列的 Length 使用 for 迴圈可提供相同的賦值。

using System;

class Program
{
    static void Main()
    {
        byte[] buffer = new byte[4];
        Array.Fill(buffer, (byte)255);
        Console.WriteLine(string.Join(", ", buffer));
    }
}
255, 255, 255, 255

強制轉換使該值的型別顯式。位元組可以容納 0 到 255 之間的值。

使用 LINQ 從重複值建立陣列

Enumerable.Repeat 產生一個包含某個值的序列,該值出現請求的次數。呼叫 ToArray 將該序列具體化為 byte[]。該範例匯入了 System.Linq,它提供了這兩個方法。

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        byte value = 42;
        int length = 5;
        byte[] values = Enumerable.Repeat(value, length).ToArray();
        Console.WriteLine(string.Join(", ", values));
    }
}
42, 42, 42, 42, 42

當新陣列應自始至終包含相同的值時,這種方法具有可讀性。當你已經有一個要更新的陣列時,請使用 Array.Fill。

使用 Buffer.BlockCopy 複製原始位元組

Buffer.BlockCopy 在元素型別為基元型別的陣列之間複製原始位元組,例如 byte[] 或 int[]。它的來源偏移和目標偏移以及它的 count 都以位元組為單位測量,而不是以陣列元素為單位。確保來源範圍和目標範圍有足夠的空間進行請求的複製。它不會產生或填充一般值;對於該任務,請使用迴圈或 Array.Fill。

此範例將來源位元組陣列中的四個位元組複製到從位元組偏移一開始的目標陣列中。

using System;

class Program
{
    static void Main()
    {
        byte[] source = { 10, 20, 30, 40 };
        byte[] destination = new byte[6];

        Buffer.BlockCopy(source, 0, destination, 1, source.Length);
        Console.WriteLine(string.Join(", ", destination));
    }
}
0, 10, 20, 30, 40, 0

從較大的數值陣列複製位元組時,複製計數和偏移仍然使用位元組。例如,這將兩個 int 值中的前四個位元組複製到一個四位元組的目標中:

using System;

class Program
{
    static void Main()
    {
        int[] numbers = { 0x01020304, 0x05060708 };
        byte[] bytes = new byte[4];

        Buffer.BlockCopy(numbers, 0, bytes, 0, bytes.Length);
        Console.WriteLine(string.Join(", ", bytes));
    }
}

數值陣列範例與平台相關:每個 int 中位元組的順序取決於平台的表示形式。在提供的環境中,此範例產生了 4, 3, 2, 1;該觀察到的順序特定於平台的整數位元組表示形式,並不普遍。從 byte[] 複製可避免這種解釋,因為其元素已經是位元組。

選擇一種初始化方法

當你需要一個用零初始化的固定大小陣列時,請使用 new byte[length],對於一小列已知值,請使用初始化器。對於按位置計算的值,請使用迴圈;對於為現有陣列分配一個值,請使用 Array.Fill;或者使用 Enumerable.Repeat(...).ToArray() 透過 LINQ 建構重複值陣列。當資料已經作為原始位元組存在於陣列中並且需要複製時,請選擇 Buffer.BlockCopy。