DOBON.NETプログラミング道掲示板
(現在 過去ログ4 を表示中)
HOME
HELP
新規作成
新着記事
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
[
最新記事及び返信フォームをトピックトップへ
]
[ トピック内全3記事(1-3 表示) ] <<
0
>>
■34611
/ inTopicNo.1)
クラスによる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
/ inTopicNo.2)
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
/ inTopicNo.3)
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/
HOME
HELP
新規作成
新着記事
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
-
Child Tree
-