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メソッドを記述する必要がありますか?
Base64は「署名済み」または「署名なし」を気にしません。私は問題はあなたが別のバイト配列を変換していることだと思うので、 'longToBytes'で問題の原因を見つけることができます。 –
C#の '>>'は論理シフトであるので、Javaで同じことをするには、 'bytes [i] =(byte)((bytes [i]&0xff)>> 2)'を実行する必要があります。 – saka1029
私はそれを試しましたが、intに代入するときにのみ動作し、バイトに代入すると、再び符号なしの振る舞いが失われます – Carmine