10

この変換関数では

public static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

byte[] test = GetBytes("abc");

結果の配列には文字が含まれていません

test = [97, 0, 98, 0, 99, 0]

byte[] を文字列に戻すと、結果は次のようになります。

string test = "a b c "

それらのゼロを作成しないようにするにはどうすればよいですか

4

5 に答える 5

6

まず、コードの誤りを見てみましょう。char.NET Frameworkでは16ビット(2バイト)です。つまり、を書くsizeof(char)と、が返されます2str.Lengthである1ため、実際のコードはbyte[] bytes = new byte[2]同じになりbyte[2]ます。したがって、Buffer.BlockCopy()メソッドを使用する場合、実際に2はソース配列から宛先配列にバイトをコピーします。これは、GetBytes()メソッドが戻りbytes[0] = 32bytes[1] = 0文字列が。である場合を意味します" "

Encoding.ASCII.GetBytes()代わりに使用してみてください。

派生クラスでオーバーライドされると、指定された文字列内のすべての文字がバイトシーケンスにエンコードされます。

const string input = "Soner Gonul";

byte[] array = Encoding.ASCII.GetBytes(input);

foreach ( byte element in array )
{
     Console.WriteLine("{0} = {1}", element, (char)element);
}

出力:

83 = S
111 = o
110 = n
101 = e
114 = r
32 =
71 = G
111 = o
110 = n
117 = u
108 = l
于 2013-01-06T12:11:17.093 に答える
1

答えについての混乱を解消するために、C#のchar型は2バイトかかります。したがって、string.toCharArray()は、各アイテムが2バイトのストレージを使用する配列を返します。各アイテムが1バイトのストレージを使用するバイト配列にコピーしているときに、データが失われます。したがって、結果としてゼロが表示されます。
提案されているように、Encoding.ASCII.GetBytesを使用する方が安全なオプションです。

于 2013-01-06T12:22:17.343 に答える
1

実際には、.net (少なくとも 4.0 の場合) は、BinaryWriter でシリアル化すると自動的に char のサイズを変更します

UTF-8 文字は可変長 (1 バイトではない可能性があります)、ASCII 文字は 1 バイトです

'ē' = 2 バイト

'e' = 1 バイト

使用する際には注意が必要です

BinaryReader.ReadChars(stream)

単語 "ēvalds" = 7 バイトの場合、サイズは "evalds" = 6 バイトとは異なります。

于 2013-12-02T10:08:02.803 に答える
0

明示的に指定してみてくださいEncoding。次のコードを使用して、指定されたエンコーディングで文字列をバイトに変換できます

byte[] bytes = System.Text.Encoding.ASCII.GetBytes("abc");

バイトの内容を出力すると{ 97, 98, 99 }、例のようにゼロを含まないものが得られます。この例では、シンボルあたり16ビットを使用するデフォルトのエンコーディングです。の結果を印刷することで観察できます

System.Text.Encoding.Unicode.GetBytes("abc"); // { 97, 0, 98, 0, 99, 0 }

次に、それを元に戻すときに、適切なエンコーディングを選択する必要があります。

string str = System.Text.Encoding.ASCII.GetString(bytes);
Console.WriteLine (str);

期待どおりに印刷"abc"します

于 2013-01-06T12:11:12.597 に答える
0

(97,0) は「a」の Unicode 表現です。Unicode は、各文字を 2 バイトで表します。したがって、ゼロを削除することはできません。ただし、エンコーディングを ASCII に変更することはできます。文字列をバイト[]に変換するには、次を試してください。

byte[] array = Encoding.ASCII.GetBytes(input);
于 2013-01-06T12:18:56.857 に答える