バイナリ ファイルを ascii 文字の配列に変換したいと考えています。どうやってやるの 。ありがとうございました 。
5 に答える
それはあなたがそれで何をしたいかによって異なります。Ascii は 7 ビットであると想定されています (0 ~ 127 は明確に定義されており、他の文字はコードページに依存します)。したがって、プレーンな ASCII エンコーディングは厄介な驚きにつながる可能性があります (その中には、null として印刷できない文字があります...)
バイト配列から印刷可能なものを作成したい場合は、それらを ASCII エンコーディングで変換しないでください。Base64 でエンコードすることをお勧めします。これは、バイナリを文字列にエンコードするための安全な (サイズ的には最適ではありませんが) 方法です。
バイトを Base64 でエンコードするには、次のようにします。
string result = System.Convert.ToBase64String(yourByteArray);
BASE64 または UUEncoding を確認してください。256 文字の ASCII セットから印刷可能な文字のみを使用したいと考えていると思います。
BASE64 は 64 文字しか使用しません (これは、電子メールでバイナリを送信する場合などに使用されることがあります)。これにより、出力のサイズが大きくなります。状況に応じて考慮する必要があります。
StreamReader reader = new StreamReader("pathtoyourbinaryfile", System.Text.Encoding.ASCII);
char[] text = reader.ReadToEnd().ToCharArray();
各文字を読み取って、char にキャストするだけです。これにより、すべてのバイトがASCII文字に変換されます。それはあなたがやろうとしていることですか?
以前の回答者が質問に答えたとは思えません。バイトを意味するときに ASCII と言う人が多いので、質問者はエンコードされた文字を含むテキスト ファイルではなく、バイナリ ファイルを読みたかったのではないかと思います。
さまざまな手法の影響を示すために、次の文字列から UTF-8 テキスト ファイルを作成しました。
string s = "\ta£\x0394\x221A"; // tab; lower case a; pound sign; Greek delta; square root
次のプログラムは、このファイルを最初にテキスト文字列として読み取り、次にバイト配列として読み取ります。いずれの場合も、入力は最初に 10 進数で表示され、次に 16 進数で表示されます。
String test = "";
String fileStg = File.ReadAllText("Test.txt");
for (int i = 0; i < fileStg.Length; i++)
test += (int)fileStg[i] + " ";
Debug.Print(test);
test = "";
for (int i = 0; i < fileStg.Length; i++)
test += ((int)fileStg[i]).ToString("X") + " ";
Debug.Print(test);
test = "";
Byte[] fileByte = File.ReadAllBytes(pathProg + "Test.txt");
for (int i = 0; i < fileByte.Length; i++)
test += fileByte[i].ToString() + " ";
Debug.Print(test);
test = "";
for (int i = 0; i < fileByte.Length; i++)
test += fileByte[i].ToString("X") + " ";
Debug.Print(test);
出力:
9 97 163 916 8730 13 10 9 61 A3 394 221A D A 239 187 191 9 97 194 163 206 148 226 136 154 13 10 EF BB BF 9 61 C2 A3 CE 94 E2 88 9A D A
テキスト ファイルとして読み取ると、BOM が取り除かれ、マルチバイト UTF-8 文字が入力文字列内の 1 文字になることに注意してください。しかし、バイトの配列として読み取ると、BOM と生の UTF-8 を受け取ります。
質問者は Unicode テキスト ファイルではなく本物のバイナリ ファイルを読みたかったのではないかと思いますが、この例は 2 つの手法の効果をよりよく示しており、質問者がバイナリ ファイルを読みたい場合は ReadAllBytes がより適切な手法であることを示していると思います。