java - 为什么这个java代码返回负值,我怎样才能将它转换为delphi?

标签 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

//======================================

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/

相关文章:

java - Quartz 调度程序有包含日历吗

delphi - 启用运行时主题时,FTouchManager 会导致 AV

delphi - 如何分配多行字符串值而不引用每一行?

java - 如何使用Java打开联网计算机上的目录

java - JPA 删除所有不适用于 Google 应用引擎的内容

java - @ControllerAdvice 不触发

delphi - delphi创建表单时出错

delphi - 是否可以在运行时创建TClientDataSet嵌套(一对多)数据集

delphi - Delphi 中带有泛型的简单类型

java - 游戏/应用程序菜单作为游戏/应用程序的核心部分