質問

C# で 32 ビット整数を 4 つの (符号なし) 文字に分割する最良の方法は何ですか。

役に立ちましたか?

解決

クイックアンドダーティ:

int value = 0x48454C4F;
Console.WriteLine(Encoding.ASCII.GetString(
  BitConverter.GetBytes(value).Reverse().ToArray()
));

int をバイトに変換し、正しい順序になるようにバイト配列を逆にして、そこから ASCII 文字表現を取得します。

編集:Reverse メソッドは .NET 3.5 の拡張メソッドです。参考までに。シナリオによっては、バイト順序を逆にする必要がない場合もあります。

乾杯、デビッド

他のヒント

シャア?おそらく、この便利な小さなヘルパー関数を探しているのではないでしょうか?

Byte[] b = BitConverter.GetBytes(i);
Char c = (Char)b[0];
[...]

これが本当にあなたが望むものであるかどうかは明らかではありませんが、次のとおりです。

int x = yourNumber();
char a = (char)(x & 0xff);
char b = (char)((x >> 8) & 0xff);
char c = (char)((x >> 16) & 0xff);
char d = (char)((x >> 24) & 0xff);

これは、バイトを Unicode 文字の最低範囲として解釈することを前提としています。

いくつかの方法を試して、1000000 int の変換にかかる時間を計測しました。

組み込みの変換メソッド、325000 ティック:

Encoding.ASCII.GetChars(BitConverter.GetBytes(x));

ポインタ変換、100000 ティック:

static unsafe char[] ToChars(int x)
{
    byte* p = (byte*)&x)
    char[] chars = new char[4];
    chars[0] = (char)*p++;
    chars[1] = (char)*p++;
    chars[2] = (char)*p++;
    chars[3] = (char)*p;

    return chars;
}

ビットシフト、77000 ティック:

public static char[] ToCharsBitShift(int x)
{
     char[] chars = new char[4];
     chars[0] = (char)(x & 0xFF);
     chars[1] = (char)(x >> 8 & 0xFF);
     chars[2] = (char)(x >> 16 & 0xFF);
     chars[3] = (char)(x >> 24 & 0xFF);
     return chars;
}

8 バイトのブロックを取得します。

int a = i & 255; // bin 11111111
int b = i & 65280; // bin 1111111100000000

最初の 3 バイトを 1 バイトに分割し、それらを適切な数値で割って、別の論理演算を実行して最終バイトを取得します。

編集:もちろん、ビットシフトを使用したジェイソンの解決策の方がはるかに優れています。

ビットコンバータ

.net は Unicode を使用しており、文字は 1 バイトではなく 2 バイトです

非 Unicode テキストを含むバイナリ データ間で変換するには、System.Text.Encoding クラスを使用します。

文字ではなく4バイトが必要な場合は、ジェイソンの答えの文字をバイトに置き換えてください

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top