2009-05-29 5 views
6

最近、Webサービスコールの秘密鍵をハッシュしたベンダーのサンプルコードがありました。そのサンプルはVB.NETにあり、C#に変換されました。これにより、ハッシングによって異なる入力が生成されました。暗号化の鍵を生成する方法は、char配列を文字列に変換してからバイト配列に戻すことでした。これは、VB.NETとC#のデフォルトのエンコーダがいくつかの文字で異なって動作することを発見しました。Encoding.Default.GetBytes()がVB.NETとC#で異なる結果を返すのはなぜですか?

のC#:

Console.Write(Encoding.Default.GetBytes(new char[] { (char)149 })[0]); 

VB:

Dim b As Char() = {Chr(149)} 
Console.WriteLine(Encoding.Default.GetBytes(b)(0)) 

VBが149 あなたが使用している場合、他の値が、145のように、などの正しいバイト値であるのに対し、C#の出力は、63であります、出力は一致します。

VBとC#のデフォルトのエンコーダの両方をデバッグすると、SBCSCodePageEncodingになります。

これはなぜですか?

バイト配列を直接初期化することによって修正されていますが、それは最初にあったはずですが、言語固有ではないはずのエンコーダがなぜそうであるかを知りたいのです。

答えて

11

ChrW(149)を使用すると、C#と同じ63の別の結果が得られます。

Dim b As Char() = {ChrW(149)} 
Console.WriteLine(Encoding.Default.GetBytes(b)(0)) 

読むthe documentation

+2

...このC#コードと同じ出力を生成します。http://msdn.microsoftは.com/ja-us/library/613dxh46(VS.80).aspx –

+0

乾杯Jon-さんはちょうどリンクを追加中です。 – RichardOD

+0

ありがとう!私はそれがChr()ビットと関係があると思っていましたが、VB.NETでChr()を使用しないようにする方法がわかりませんでした。 – Annagram

0

default encodingは、現在のコードページを使用するため、マシンに依存するだけでなくスレッドにも依存します。あるマシンがユニコードを使用していて、別のマシンが1252-ANSIを使用しているときに何が起こるか心配する必要がないように、Encoding.UTF8のようなものを使用するのが一般的です。

0

異なるオペレーティングシステムでは、デフォルトと異なるエンコーディング が使用されることがあります。 したがって、あるオペレーティングシステムから別のオペレーティングシステムにストリームされたデータは、 が正しく翻訳されていない可能性があります。 エンコードされたバイトが正しくデコードされるようにするには、 Unicodeエンコーディング、つまり UTF8Encoding、UnicodeEncoding、または UTF32Encodingとプリアンブルを使用する必要があります。 の上位プロトコルを使用して、 のエンコーディングとデコードに同じ形式の が使用されていることを確認してください。 http://msdn.microsoft.com/en-us/library/system.text.encoding.default.aspx

から

はあなたが明示的にUTF8を使用してエンコードする際に、各言語が生成するかどうか確認できますか?

4

VB Chr関数は、0〜255の範囲で引数を取るの答えを説明しますdifference-を見て、現在のデフォルトコードページを使用して文字に変換します。この範囲外の引数を渡すと例外がスローされます。

ChrWは16ビットの値を取り、対応するシステムを返します。エンコーディングを使用しないChar値 - したがって、あなたが投稿したC#コードと同じ結果が得られます。

VB文字列クラスを使用せずにC#であなたのVBコードのおおよそ同等の(つまり、Chr関数とChrWを含むクラスです)次のようになります。

char[] chars = Encoding.Default.GetChars(new byte[] { 149 }); 
Console.Write(Encoding.Default.GetBytes(chars)[0]); 
0

私はVBの等価は、ChrW(149)であると考えてい。

ので、このVBコード...

Dim c As Char() = New Char() { Chr(149) } 
    'Dim c As Char() = New Char() { ChrW(149) } 
    Dim b As Byte() = System.Text.Encoding.Default.GetBytes(c) 
    Console.WriteLine("{0}", Convert.ToInt32(c(0))) 
    Console.WriteLine("{0}", CInt(b(0))) 

は、ここでのドキュメントへのリンクです

var c = new char[] { (char)149 }; 
    var b = System.Text.Encoding.Default.GetBytes(c); 
    Console.WriteLine("{0}", (int)c[0]); 
    Console.WriteLine("{0}", (int) b[0]); 
関連する問題