为什么这个java代码返回负值,如何将其转换为delphi?

时间:2015-02-28 12:20:14

标签: java delphi

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

2 个答案:

答案 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相同。