7

この時点で、ほとんどの人は「ああ、これを投稿するのは悪い..:」と考えるでしょう。

byte[] dataB= System.Text.Encoding.ASCII.GetBytes(data);

ただし、私が抱えている問題は、各バイトの純粋な値だけをエンコードせずに、バイトの正確な値が必要なことです。たとえば、文字列の値が (0xFF32) の場合、それも {255,50} に変換します。これの理由は、バイトが int を保存し、プログラムが開いたときにそれらを読み取るファイル形式を読み取ろうとしているからです。

これは私がこれまでに持っているものです:

...
dialog.InitialDirectory =
    Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop) +
    "/Test";

dialog.Title="Open File";

if (dialog.ShowDialog(this) == DialogResult.OK)
{
    StreamReader reader = new StreamReader(dialog.FileName);
    string data = reader.ReadToEnd();
    reader.Close();
    byte[] fileC = System.Text.Encoding.ASCII.GetBytes(data);
    File_Read(dialog.FileName,fileC);
}
...

したがって、ファイルを読み込もうとすると、0xFF は 127 より大きく、0x3F は ? であるため、0xFF のファイル修道院が 0x3F に変換されます。

少し混乱しているようでしたら申し訳ありません:)

ありがとう、マイケル

4

6 に答える 6

17

問題は、最初のアプローチにあります。

エンコードなしのバイトの正確な値が必要です

...

たとえば、文字列の値が (0xFF32) の場合

これは、油絵を見て「エンコーディングなしで、その絵のバイトが欲しい」と言うようなものです。意味がありません。テキストはバイナリ データと同じではありません。それを理解すれば、問題の根本にたどり着くのは簡単です。本当に必要なのは、バイト配列としてのファイルの内容です。ファイルはバイナリ データなので、簡単です。それが実際にテキストでない場合、そもそもテキストとして読むべきではありません。幸いなことに、.NET を使用すると、これが非常に簡単になります。

byte[] fileC = File.ReadAllBytes(dialog.FileName);
于 2009-02-12T19:05:53.203 に答える
13

ただし、私が抱えている問題は、各バイトの純粋な値だけをエンコードせずに、バイトの正確な値が必要なことです。

次に、これを使用します。

byte[] dataB = System.Text.Encoding.Unicode.GetBytes(data);

.NET 文字列によって内部的に格納されているバイトを返します。

しかし、これはすべて codswallop です。文字列は常に特定のエンコーディングにリンクされており、それを回避する方法はありません。上記は、たとえば、ファイルに無効な Unicode コード シーケンスが含まれている場合 (発生する可能性があります)、または正規化によって失敗します。明らかに必要ないのでstring読まないでください。代わりにファイルをバイナリ データとして読み取ります。

于 2009-02-12T19:02:25.253 に答える
12

//文字列をバイト配列に変換

public static byte[] StrToByteArray(string str)
{
    System.Text.UTF8Encoding  encoding=new System.Text.UTF8Encoding();
    return encoding.GetBytes(str);
}

//バイト配列を文字列に変換

public string ByteArrayToStr(byte [] dBytes)
{
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
return enc.GetString(dBytes);
}
于 2012-05-07T09:36:35.217 に答える
4

BinaryReaderを使用します。

于 2009-02-12T19:01:59.733 に答える
3

なぜ文字列から変換するのですか? ファイルの内容を直接バイト単位で読み取ることはできませんか?

byte[] fileC = File.ReadAllBytes(dialog.FileName);
于 2009-02-12T19:05:52.437 に答える
1

バイトが必要な場合は、ストリームを使用してください!

なぜあなたはTextReaderをいじっているのですか?

編集:

あなたの例によると、ファイルを開いているので、FileStream を使用してください。

于 2009-02-12T19:05:44.747 に答える