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
//======================================
My Delphi code:
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
最佳答案
字节在 Java 中是有符号的。在 Delphi 中,要复制此代码,您需要使用等效的 type 。具体Shortint
,一个有符号的 8 位整数。此外,long
是 Java 中的有符号 64 位类型。在德尔福你需要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 代码的 >>>
相匹配。
关于java - 为什么这个java代码返回负值,我怎样才能将它转换为delphi?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28781625/