byte型の Pointer で char型を Cast

byte0 = 31
byte1 = 0
byte0 = 41
byte1 = 0
byte0 = 68
byte1 = 88

C# で byte型の Pointer で char型のデータに Cast して、メモリの内容を16進数でダンプします。
C# でポインタを使うときは unsafe の設定が必要です。

プログラムの説明

  1. Pointer を使うときは unsafe の設定をして下さい。
    unsafe の設定は Pointer を使う を参照して下さい。
  2. char型のデータと byte型の Pointer です。
    char c1 = '1';
    char c2 = 'A';
    char c3 = '表';
    byte* byt;
  3. byte型の Pointer で char型のデータを Cast して、Type() メソッドを呼び出します。
        byt = (byte *)&c1;
        Type(byt);
        
  4. byte型の Pointer を受けて char型のデータを16進数でダンプします。
    sizeof(char) で char型のサイズ(2 byte)を取得しています。
        public static void Type(byte *pt)
        {
            for(int i=0; i<sizeof(char); i++)
                Console.WriteLine("byte{0} = {1:X}", i,*(pt+i));
        }
        
  5. このプログラムを実行すると次のように表示されました。
    byte0 = 31
    byte1 = 0
    byte0 = 41
    byte1 = 0
    byte0 = 68
    byte1 = 88
    Shift-JIS では '表' が '955C' で、'\' の '5C' と混同する問題があったのですが、 C# では全ての文字が16ビットで表現されるので、問題は一挙に解決です。
  6. class Test には unsafe を設定します。
    /**************************************************/
    /*★ char を byte ポインタにキャスト    前田 稔 ★*/
    /**************************************************/
    using System;
    
    unsafe class Test
    {
        public static void Main()
        {
            char c1 = '1';
            char c2 = 'A';
            char c3 = '表';
            byte* byt;
            byt = (byte *)&c1;
            Type(byt);
            byt = (byte*)&c2;
            Type(byt);
            byt = (byte*)&c3;
            Type(byt);
            Console.ReadLine();
        }
    
        public static void Type(byte *pt)
        {
            for(int i=0; i<sizeof(char); i++)
                Console.WriteLine("byte{0} = {1:X}", i,*(pt+i));
        }
    }
    

【演習】

  1. 次の値をダンプするとどのように表示されるでしょうか?
    c2 の文字は全角の「5」です。
    char c1 = 'z';
    char c2 = '5';
    char c3 = '漢';

超初心者のプログラム入門(C# Frame Work)