2017-07-31 3 views
0

C#とJavaの両方で同じBase64文字列を取得するのに苦労していますJavaで符号なしの方法でバイト配列をBase 64文字列に変換するには?

JavaはBase64に変換するときにバイトを符号なしのものとして扱います。

はここに私のC#のコードJavaでは

private static void Main(string[] args) 
{ 
    long baseTimeStamp = 1501492600; 
    byte[] bytes = BitConverter.GetBytes(baseTimeStamp * 114); 

    for (int i = 0; i < bytes.Length; i++) 
    { 
     bytes[i] = (byte)(bytes[i] >> 2); 
    } 

    string base64 = Convert.ToBase64String(bytes); 

    Console.WriteLine(base64); 
} 

だ、私は同じlong値ここで

に同じにBase64を取得したいことは、私が試したコード

public static void main(String[] args) { 
    long myLong = 1501492600; 

    byte[] bytes = longToBytes(myLong); 

    for(int i = 0; i < bytes.length/2; i++) 
    { 
     int temp = bytes[i]; 
     bytes[i] = bytes[bytes.length - i - 1]; 
     bytes[bytes.length - i - 1] = (byte) temp; 

     bytes[i] = (byte)((bytes[i] >> 2)); 
    } 

    System.out.println(DatatypeConverter.printBase64Binary(bytes)); 
} 

private static byte[] longToBytes(long x) { 
    ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); 
    buffer.putLong(x); 
    return buffer.array(); 
} 

両方のコメント方法です、そしてDatatypeConverterの方法ですが、私は異なるString値を取得します。標準的なJDKの方法がありますか、またはバイトコードを符号なしのものとして扱うために独自のbase64メソッドを記述する必要がありますか?

+0

Base64は「署名済み」または「署名なし」を気にしません。私は問題はあなたが別のバイト配列を変換していることだと思うので、 'longToBytes'で問題の原因を見つけることができます。 –

+0

C#の '>>'は論理シフトであるので、Javaで同じことをするには、 'bytes [i] =(byte)((bytes [i]&0xff)>> 2)'を実行する必要があります。 – saka1029

+0

私はそれを試しましたが、intに代入するときにのみ動作し、バイトに代入すると、再び符号なしの振る舞いが失われます – Carmine

答えて

0

Base64はビットを変換します。バイトを符号付きまたは符号なしと考えるかどうかはわかりません。あなたが異なる価値を得ているなら、問題はどこか別のものです。

しかし、ビットシフトを行っているので、符号拡張>>の代わりにゼロ充填バージョン>>>を使用する必要があります。それがあなたの問題の原因かもしれません。

DatatypeConverterはまだ最も簡単な方法です。

+0

あなたは正しいです、変換は正しく、問題はシフトにありますが、 '>'と '>>>' – Carmine

関連する問題