10

私はこのコードを持っています:

Int32 i1 = 14000000;
byte[] b = BitConverter.GetBytes(i1);
string s = System.Text.Encoding.UTF8.GetString(b);
byte[] b2 = System.Text.Encoding.UTF8.GetBytes(s);
Int32 i2 = BitConverter.ToInt32(b2,0);;

i2 は -272777233 です。入力値ではないのはなぜですか?(14000000) ?

編集:私がやろうとしているのは、それを別の文字列に追加してから、WriteAllText を使用してファイルに書き込むことです

4

5 に答える 5

14

クラスは何のためEncodingにもうまくいくわけではないからです。「文字」(UTF-8の場合はおそらく数バイト)がその特定の文字セット(あなたの場合はUTF-8)で有効な文字ではない場合、置換文字が使用されます。

単一のクエスチョン マーク (U+003F)

(出典: http://msdn.microsoft.com/en-us/library/ms404377.aspx#FallbackStrategy )

場合によっては?、たとえば ASCII/CP437/ISO 8859-1 では単なる ですが、それをどうするかを選択する方法があります。(上記リンク参照)

たとえば、(byte)128ASCIIに変換しようとすると、次のようになります。

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)また、文字列の長さにプレフィックスを付けて読み返すときに依存するため、テキスト エディターを使用して結果のファイルを編集することは適切ではないことに注意してください。(まあ、バイナリ形式で整数を書いているので、これは受け入れられると思いますか?)

于 2013-01-05T02:49:23.187 に答える
5

逆方向のエンコードを使用しているため、機能していません。

エンコーディングは、テキストをバイトに変換し、再びテキストに戻すために使用されます。任意のバイトを取得してテキストに変換することはできません。すべての文字には対応するバイト パターンがありますが、すべてのバイト パターンが文字に変換されるわけではありません。

バイトをテキストとして表現するコンパクトな方法が必要な場合は、base-64 エンコーディングを使用します。

Int32 i1 = 14000000;
byte[] b = BitConverter.GetBytes(i1);
string s = Convert.ToBase64String(b);

byte[] b2 = Convert.FromBase64String(s);
Int32 i2 = BitConverter.ToInt32(b2, 0);
于 2013-01-05T03:10:46.140 に答える
3

ここでの目標が整数を文字列として格納してから整数に戻すことである場合、何かが欠けていない限り、次の方法では十分ではありません。

int32 i1 = 1400000;
string s = il.ToString();
Int32 i2 = Int32.Parse(s);
于 2013-01-05T02:52:55.540 に答える