1

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

byte[] bytes = ...

// Here my bytes.Lenght is 181 (for example)

var str = UTF8Encoding.UTF8.GetString(bytes);
bytes = UTF8Encoding.UTF8.GetBytes(str);

// Here my bytes.Lenght is 189

なんで?
文字列をbyte[]に正しく変換するにはどうすればよいですか?

編集:例

public class Person 
{
    public string Name { get; set; }
    public uint Age { get; set; }
}

...

Person p = new Person { Name = "Mary", Age = 24 };

string str;
byte[] b1, b2;

using (var stream = new MemoryStream())
{
    new BinaryFormatter().Serialize(stream, p);
    b1 = stream.ToArray();
    str = UTF8Encoding.UTF8.GetString(b1);
}

b2 = UTF8Encoding.UTF8.GetBytes(str);
4

3 に答える 3

2
// Here my bytes.Lenght is 181 (for example)    
// Here my bytes.Lenght is 189

それが起こる可能性があります。

文字列を正しく変換するにはどうすればよいbyte[]ですか?

サイズの違いは、変換が無効であることを意味するものではありません。ただし、最初のシーケンスはそうであった可能性があります。

サイズを保持したい場合は、ASCIIエンコーディングを使用してください。


展開編集後:

new BinaryFormatter().Serialize(stream, p);
b1 = stream.ToArray();
str = UTF8Encoding.UTF8.GetString(b1);
b2 = UTF8Encoding.UTF8.GetBytes(str);

BinaryFormatterがUTF8エンコーディングを文字列に適用することを前提としています。
おそらくそうではありません。ストリームに追加のデータ(マーカーとサイズフィールド)を追加します。

したがって、2つの変換(SerializeおよびGetString)は互換性がありません。

サイズの違いは別として、結果を表示すると、おそらくいくつかの「奇妙な」文字が含まれます。


2番目の編集:

新しいバイト配列(b2)を逆シリアル化すると、例外が発生します

右。実際に必要なのはConvert.ToBase64String()、ではありませんUTF8.GetString()

Base64文字列は、文字列として保存および転送してから、byte[]再度変換することができます。

于 2012-10-23T14:32:25.777 に答える
1

文字列との間で任意のシリアルbyte[]化を行う場合は、UTF8エンコーディングを使用せず、Base64を使用してください。

于 2012-10-23T14:36:18.330 に答える
1

バイナリデータを UTF8.GetString(または任意のエンコーディングで)文字列に変換しようとしないでください。代わりに使用Convert.ToBase64Stringして くださいConvert.FromBase64String

于 2012-10-23T14:37:22.850 に答える