web-dev-qa-db-ja.com

C#のsprintf?

C#のsprintf()に似たものはありますか?

たとえば、整数を2バイトのバイト配列に変換したいと思います。

何かのようなもの:

int number = 17;
byte[] s = sprintf("%2c", number);
20

私が本当に欲しかったのはこれであることが判明しました:

short number = 17;
System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream);
writer.Write(number);
writer.Flush();

ここで重要なのは、BinaryWriterクラスの書き込み関数です。 18のオーバーロードがあり、さまざまな形式をバイト配列に変換してストリームに書き込みます。私の場合、書き込みたい数値が短いデータ型に保持されていることを確認する必要があります。これにより、Write関数は2バイトを書き込みます。

3
string s = string.Format("{0:00}", number)

最初の0は、「最初の引数」(つまり数値)を意味します。コロンの後の00は、フォーマット指定子(2桁の数字)です。

ただし、.NET文字列はUTF-16であるため、2文字の文字列は2ではなく4バイトであることに注意してください。

(編集:質問がstringからbyte[]に変更されました)

バイトを取得するには、Encodingを使用します。

byte[] raw = Encoding.UTF8.GetBytes(s);

(明らかに、異なるエンコーディングは異なる結果をもたらす可能性があります。UTF8はこのデータに2バイトを与えます)

実際、最初のビットの短いバージョンは次のとおりです。

string s = number.ToString("00");

ただし、string.Formatバージョンの方が柔軟性があります。

27
Marc Gravell

編集:整数の値をバイト配列に変換し、最初に文字列に変換してからバイト配列に変換する値ではないと仮定しています(後者についてはmarcの回答を確認してください)。

Intをバイト配列に変換するには、次を使用できます。

byte[] array = BitConverter.GetBytes(17);

ただし、2バイトではなく4バイトの配列が得られます(intは32ビットであるため)。2バイトの配列を取得するには、次を使用する必要があります。

byte[] array = BitConverter.GetBytes((short)17);

値17を2文字に変換するだけの場合は、次を使用します。

string result = string.Format("{0:00}", 17);

しかし、marcが指摘したように、.NETの各文字は2バイト(UTF-16)であるため、結果は4バイトを消費します(文字列の長さを保持する2バイトを含むと6バイトになります)。

4
Yona