v = -6833708440360172059
public static byte[] longToBytes(long v) {
byte[] p = new byte[8];
for (int i = 0; i < 8; i++) {
p[7-i] = (byte) ((v >>> 8*i) & 0xff);
System.out.println("p="+ p[i]);
}
return p;
}
结果:
p=0 p=0 p=0 p=0 p=73 p= -66 p=69 p= -27
// ======================================
我的Delphi代码:
Function TForm1.U64TO8( v : UInt64): TByteArray;
var
i : Integer;
p : TByteArray;//array [0..7] of byte;
begin
SetLength(p, 8);
for i:= 0 to 7 do
p[7-i] := byte( (v SHR (8 * i) ) and $ff );
end;
// ==================================
结果:
p=0 p=0 p=0 p=0 p=73 p=190 p=69 p=229
答案 0 :(得分:2)
字节用Java签名。在Delphi中,要复制此代码,您需要使用等效的type。特别是Shortint
,一个带符号的8位整数。此外,long
是Java中带符号的64位类型。在Delphi中,您需要Int64
。
我并不特别希望重现您的Java代码,因为它只打印4个字节。当然你不想这样做?
你可以像这样编码:
function GetSignedBytes(Value: Int64): TArray<Shortint>;
var
i: Integer;
begin
SetLength(Result, 8);
for i := 0 to 7 do
Result[7-i] := Shortint(Value shr (8*i));
end;
请注意,Delphi的shr
是无符号右移,与您的Java代码>>>
匹配。
答案 1 :(得分:1)
Java中的一个字节是有符号的(即值在-128和127之间)。基于Delphi代码输出(我不知道Delphi),Delphi中的字节是无符号的。无符号字节中的190与有符号字节中的-66相同。