2011-08-03 6 views
4

次の2つのメソッドをC#に変換しようとしています。率直に言って、私はちょうど2つの方法が本当に裏で働いているか理解できません。だからここで答えと説明がすばらしくなるだろう。JavaメソッドをC#に変換する:ビットシフト演算子を使用してバイトを整数に変換する

public static int bytesToInt(byte b0, byte b1, byte b2, byte b3) 
{ 
     return (((int)b0 << 24) & 0xFF000000) 
      | (((int)b1 << 16) & 0x00FF0000) 
      | (((int)b2 << 8) & 0x0000FF00) 
      | ((int)b3 & 0x000000FF); 
} 

public static byte[] charToBytes(char c) 
{ 
    byte[] result = new byte[2]; 

    result[0] = (byte) ((c >>> 8) & 0x00FF); 
    result[1] = (byte) ((c >>> 0) & 0x00FF); 

    return result; 
} 

第2の方法は、第1の方法とは異なるシフト演算子が使用されているので、特に混乱します。

ご協力いただきありがとうございます。

答えて

4

">>>"は、Javaの符号なし右シフト演算子です。それは ">>"で置き換えることができますが、負の場合は値を符号拡張します。しかし、この場合、結果が1バイトの値(& 0x00FF)に減少するため、>>演算子の使用は無害です。

bytesToIntで使用されるマスクは、(& 0xFF000000など)Javaで、バイト値を署名されるため、すなわち、それらが正または負とすることができ、intに変換する負の値を、符号拡張することができるJavaで必要でした。しかし、C#では、バイトは正の数しかないので、マスキングは必要ありません。したがって、bytesToInt方法は、単にのように書き換えることができる:あなたが基本データ型とバイト配列との間の変換を行うためBitConverterクラスを使用することができ

return (((int)b0 << 24))  
    | (((int)b1 << 16)) 
    | (((int)b2 << 8)) 
    | ((int)b3); 
+0

を受け入れました。ヘルプと説明をありがとう! – AndHeCodedIt

0

public static int BytesToIntUsingBitConverter(byte b0, byte b1, byte b2, byte b3) 
{ 
    var byteArray = BitConverter.IsLittleEndian ? new byte[] { b3, b2, b1, b0 } : new byte[] { b0, b1, b2, b3 }; 

    return BitConverter.ToInt32(byteArray, 0); 
} 

をそしてcharToBytes()方法は次のようになり書き換え:

bytesToInt()方法は、次のようになり書き換え

public static byte[] CharToBytesUsingBitConverter(char c) 
{ 
    byte[] byteArray = BitConverter.GetBytes(c); 
    return BitConverter.IsLittleEndian ? new byte[] { byteArray[1], byteArray[0] } : byteArray; 
} 
+0

Eric、あなたの答えは正しいだけでなく正しいものです。努力をいただきありがとうございます。 – AndHeCodedIt

+0

ようこそ。私はフレームワークにできる限り多くの仕事をさせるファンです。 :) –

関連する問題