如何在 delphi 中将 long 转换为二补码、big-endian Tbytes

How to convert from long to two-complement, big-endian Tbytes in delphi

请帮我把 Java 代码翻译成 Pascal。

评论:这里准备数据,8个字节用于营业额计数器(对于每个可能的营业额都足够了......),但是规范只需要至少5个字节,0-7个字节用于周转计数器,用8字节的二补码表示,Big Endian表示(等于Java LONG),字节8-15设置为0负值是可能的(很少见)

Long turnoverCounter = 50501;
ByteBuffer byteBufferData = ByteBuffer.allocate(16);
byteBufferData.putLong(turnoverCounter);
byte[] data = byteBufferData.array();  

// data result = [0, 0, 0, 0, 0, 0, -59, 69, 0, 0, 0, 0, 0, 0, 0, 0]

java byteBuffer Data.putLong 对 Pascal 感兴趣

谢谢。

Java long 的 Pascal 等效为 Int64,您还需要更改字节顺序;例如

type
  TBufferData = array[0..15] of Byte;
  TLongBytes = array[0..7] of Byte;

procedure putLong(var Buffer: TBufferData; L: Int64);
begin
  Buffer[0]:= TLongBytes(L)[7];
  Buffer[1]:= TLongBytes(L)[6];
  Buffer[2]:= TLongBytes(L)[5];
  Buffer[3]:= TLongBytes(L)[4];
  Buffer[4]:= TLongBytes(L)[3];
  Buffer[5]:= TLongBytes(L)[2];
  Buffer[6]:= TLongBytes(L)[1];
  Buffer[7]:= TLongBytes(L)[0];
end;

另请注意,byte 是 Java 中的有符号类型,它在 Pascal 中的直接等效项是 ShortIntByte 是 Pascal 中的无符号类型)。