クラスは何のためEncoding
にもうまくいくわけではないからです。「文字」(UTF-8の場合はおそらく数バイト)がその特定の文字セット(あなたの場合はUTF-8)で有効な文字ではない場合、置換文字が使用されます。
単一のクエスチョン マーク (U+003F)
(出典: http://msdn.microsoft.com/en-us/library/ms404377.aspx#FallbackStrategy )
場合によっては?
、たとえば ASCII/CP437/ISO 8859-1 では単なる ですが、それをどうするかを選択する方法があります。(上記リンク参照)
たとえば、(byte)128
ASCIIに変換しようとすると、次のようになります。
string s = System.Text.Encoding.ASCII.GetString(new byte[] { 48, 128 }); // s = "0?"
次に、元に戻します。
byte[] b = System.Text.Encoding.ASCII.GetBytes(s); // b = new byte[] { 48, 63 }
元のバイト配列は取得できません。
これは参照することができます:文字がエンコーディングに存在するかどうかを確認します
バイト配列を文字列に変換する必要がある理由が想像できません。明らかに意味がありません。ストリームに書き込むとしましょう。直接書き込むことができますbyte[]
。何らかのテキスト表現で使用する必要がある場合は、文字列に変換してyourIntegerVar.ToString()
使用int.TryParse
するだけで元に戻すことができます。
編集:
バイト配列をファイルに書き込むことはできますが、バイト配列を文字列に「連結」して遅延メソッドを使用するつもりはありません。エンコーディング変換を処理するため、全体にFile.WriteAllText
疑問符が表示される可能性が高いからです。?
あなたのファイル。代わりに、 aを開き、バイト配列を直接書き込むためにFileStream
使用します。FileStream.Write
または、 a を使用しBinaryWriter
て整数をバイナリ形式 (および文字列) で直接書き込み、対応するものを使用してそれBinaryReader
を読み取ることができます。
例:
FileStream fs;
fs = File.OpenWrite(@"C:\blah.dat");
BinaryWriter bw = new BinaryWriter(fs, Encoding.UTF8);
bw.Write((int)12345678);
bw.Write("This is a string in UTF-8 :)"); // Note that the binaryWriter also prefix the string with its length...
bw.Close();
fs = File.OpenRead(@"C:\blah.dat");
BinaryReader br = new BinaryReader(fs, Encoding.UTF8);
int myInt = br.ReadInt32();
string blah = br.ReadString(); // ...so that it can read it back.
br.Close();
このコード例では、次の 16 進ダンプに一致するファイルが生成されます。
00 4e 61 bc 00 1c 54 68 69 73 20 69 73 20 61 20 73 Na¼..This is a s
10 74 72 69 6e 67 20 69 6e 20 55 54 46 2d 38 20 3a tring in UTF-8 :
20 29 )
BinaryWriter.Write(string)
また、文字列の長さにプレフィックスを付けて読み返すときに依存するため、テキスト エディターを使用して結果のファイルを編集することは適切ではないことに注意してください。(まあ、バイナリ形式で整数を書いているので、これは受け入れられると思いますか?)