5

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

4

6 に答える 6

7

クイック&ダーティ:

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

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

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

于 2008-09-23T13:48:53.190 に答える
5

シャア?この便利な小さなヘルパー関数をお探しですか?

Byte[] b = BitConverter.GetBytes(i);
Char c = (Char)b[0];
[...]
于 2008-09-23T13:48:42.223 に答える
4

私はそれをいくつかの方法で試し、1000000 int の変換にかかった時間を計りました。

組み込みの convert メソッド、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;
}
于 2008-09-23T14:28:09.243 に答える
4

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

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 文字の最小範囲として解釈することを前提としています。

于 2008-09-23T13:43:49.223 に答える
0

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

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

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

于 2008-09-23T13:51:41.047 に答える
0

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

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

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

編集:ビットシフトを使用したジェイソンのソリューションは、もちろんはるかに優れています。

于 2008-09-23T13:44:32.280 に答える