1. ホーム
  2. c#

[解決済み] バイト配列をデフォルトのヌル以外の特定の値に初期化する?[重複しています]。

2022-04-21 18:58:46

質問

C++でやっていた古いプロジェクトをC#に書き換えるのに忙しくしています。

私の仕事は、プログラムを書き換えて、できるだけオリジナルに近い機能を実現することです。

このプログラムを書いた前の開発者は、大量のファイルを処理する間に、ファイルが書かれなければならない決まった形式に対応する、大量のフィールドを含む構造体を作っていましたから、その作業はすべて私のために既に行われています。

これらのフィールドはすべてバイト配列です。次にC++のコードで行うのは memset を使用して、この構造体全体をすべての空白文字に設定します ( 0x20 ). 1行のコードです。簡単だ。

このファイルが最終的に行き着く先のユーティリティは、この形式のファイルを期待しているので、これは非常に重要なことです。この構造体をC#のクラスに変更しなければならないのですが、これらのバイト配列のそれぞれを簡単にすべてのスペース文字に初期化する方法を見つけることができません。

結局、クラスのコンストラクタでこうするしかない。

//Initialize all of the variables to spaces.
int index = 0;
foreach (byte b in UserCode)
{
    UserCode[index] = 0x20;
    index++;
}

これはうまくいくのですが、もっと簡単な方法があるはずです。配列に UserCode = new byte[6] コンストラクタでバイト配列が自動的に初期化され、デフォルトのヌル値になります。宣言時にすべて空白にして、クラスのコンストラクタを呼び出したときに、このようにすぐに初期化されるようにする方法はないのでしょうか?あるいは memset -のような関数ですか?

どのように解決するのですか?

小さな配列の場合は、配列の初期化構文を使用します。

var sevenItems = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };

大きな配列の場合は、標準的な for ループを使用します。これは最も読みやすく、効率的な方法です。

var sevenThousandItems = new byte[7000];
for (int i = 0; i < sevenThousandItems.Length; i++)
{
    sevenThousandItems[i] = 0x20;
}

もちろん、この処理を何度も行う必要がある場合は、ヘルパーメソッドを作成してコードを簡潔に保つことができます。

byte[] sevenItems = CreateSpecialByteArray(7);
byte[] sevenThousandItems = CreateSpecialByteArray(7000);

// ...

public static byte[] CreateSpecialByteArray(int length)
{
    var arr = new byte[length];
    for (int i = 0; i < arr.Length; i++)
    {
        arr[i] = 0x20;
    }
    return arr;
}