web-dev-qa-db-ja.com

文字列をbase64バイト配列に変換する方法、これは有効ですか?

文字列をbase64バイト配列に変換する関数を作成しようとしています。私はこのアプローチで試しました:

public byte[] stringToBase64ByteArray(String input)
{
    byte[] ret = System.Text.Encoding.Unicode.GetBytes(input);
    string s = Convert.ToBase64String(input);
    ret = System.Text.Encoding.Unicode.GetBytes(s);
    return ret;
}

この関数は有効な結果を生成しますか(文字列がUnicodeである場合)?ありがとう!

33
Tomas Vinter

アプローチは奇妙ですが、大丈夫に見えます。ただし、Encoding.ASCII.GetBytes()を使用して、base64文字列をbyte []に​​変換します。 Base64エンコードにはASCII文字のみが含まれます。Unicodeを使用すると、各文字に余分な0バイトが追加されます。

20
Hans Passant

次を使用できます。

byte []から文字列へ:

_byte[] array = somebytearray;_

string result = Convert.ToBase64String(array);

stringからbyte []:へ

array = Convert.FromBase64String(result);

58
Sonhja

文字列を文字列として表されるblobとして表すのは奇妙です...文字列を直接使用できない理由は何ですか?

文字列はalways unicode;です。変更されるのはエンコードされたバイトです。 base-64は常に<128であるため、last部分でunicodeを使用するのはやり過ぎのようです(ただし、wire-formatが要求するものでない限り)。個人的には、最後のGetBytesにUTF8またはASCIIを使用するので、各base-64文字は1バイトだけを取ります。

2
Marc Gravell

.NETのすべての文字列はUnicodeです。このコードは有効な結果を生成しますが、BASE64文字列のコンシューマーもUnicode対応である必要があります。

0
Darin Dimitrov

はい、ソース文字列のUTF-16リトルエンディアン表現のbase64エンコード文字列を出力します。私の知る限り、base64でUTF-16を使用することはあまり一般的ではないことに注意してください。ASCIIまたはUTF-8が通常使用されます。ただし、ここで重要なのは送信者と受信者どのエンコーディングを使用する必要があるかについて合意します。

バイト配列のbase64文字列を再変換する理由がわかりません:送信時のエンコードの非互換性を回避するためにbase64が使用されます。 。また、Marcが言ったように、base64には128文字以下の64文字しか含まれていないため、その目的でUTF-16を使用するのは間違いなくやり過ぎです。

0
Matteo Italia