DOBON.NETプログラミング道掲示板

■34611 / 親記事)  クラスによるGetBytes関数のエンディアンの違い
  
□投稿者/ あばば無人君 一般人(15回)-(2021/01/07(Thu) 12:13:38)
  • アイコン環境/言語:[Windows10(1909) 64bit、.Net 5.0、C#] 
    分類:[.NET] 

    いつも当サイトで勉強させて頂いております。

    さてタイトルの件ですが、BitConverterクラスで以下の通り
    GetBytes関数をコールすると結果は「42-30」となりました。

    Debug.WriteLine(BitConverter.ToString(BitConverter.GetBytes('あ')));

    文字コード表を見ると「あ」は0x3042なので、上記の結果は
    リトルエンディアンということで納得できました。
    (ちなみにBitConverter.GetBytesはUnicode値)

    ですが、以下の様にエンコーディングクラスを生成してその
    GetBytes関数をコールすると結果は「E3-81-82」となりました。

    Encoding utf8Enc = new UTF8Encoding(true);
    Debug.WriteLine(BitConverter.ToString(utf8Enc.GetBytes("あ")));

    UTF-8の「あ」は0xE38182なので値自体はあっているのですが
    バイトの並びがビッグエンディアンなのが不思議です。

    同じ言語でなぜエンディアンが異なるのか、理由が分かる方が
    いらっしゃいましたら教えて頂きたいです。

マルチポストを報告
違反を報告
引用返信 削除キー/
■34612 / ResNo.1)  Re[1]: クラスによるGetBytes関数のエンディアンの違い
□投稿者/ Hongliang 大御所(594回)-(2021/01/07(Thu) 13:29:22)
  • アイコン2021/01/07(Thu) 13:29:50 編集(投稿者)

    .NET FrameworkのCharおよびStringは、内部エンコーディングとしてリトルエンディアンのUTF-16を使用しています。
    なので'あ'は下の桁のほうが前に出てきます。

    一方、UTF-8はエンディアンを持たない固定のシーケンスになります。
    > UTF-8の「あ」は0xE38182なので
    UTF-8をn桁の16進数と考えるのは好ましくないように思います。
    0xE3, 0x81, 0x82というn個のバイトシーケンスとして捉えたほうが良いかと。
違反を報告
引用返信 削除キー/
■34614 / ResNo.2)  Re[2]: クラスによるGetBytes関数のエンディアンの違い
□投稿者/ あばば無人君 一般人(17回)-(2021/01/07(Thu) 14:32:27)
  • アイコンHongliangさん、ご回答ありがとうございます。

    > 一方、UTF-8はエンディアンを持たない固定のシーケンスになります。

    エンディアンは環境(OSとかCPU)で決まるのではなく、文字コードで
    決まるのですね。勘違いしていました。


    > .NET FrameworkのCharおよびStringは、内部エンコーディングとしてリトルエンディアンのUTF-16を使用しています。

    確認のため以下のコードを実施したところ、確かに「42-30」でした。
    Encoding uniEnc = Encoding.GetEncoding("Unicode");
    Debug.WriteLine(BitConverter.ToString(uniEnc.GetBytes("あ")));


    エンコーディングクラスでのGetBytes関数なら全てが
    ビッグエンディアンになる訳ではないと理解できました。

    本件はこれで解決済みとさせて頂きます。
    ご回答、ありがとうございました。

解決み!
違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -