2016-08-01 56 views
0

请帮我将Java代码翻译成Pascal。如何从long转换为two-complement,delphi中的big-endian Tbytes

评论:在这里准备数据,8个字节用于营业额计数器(对于每个可能的营业额......都足够了),但是规范只需要至少5个字节的字节0-7用于营业额计数器,其通过8字节双补体,大端表示(等于爪哇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字节缓冲区数据。 putlong对Pascal感兴趣

谢谢。

+0

默认情况下,Java在Big Endian中写入“long”(而不是“Long”)作为8个字节。 –

+0

“规范只需要5个字节”这5个字节你在想什么,你能澄清你的意思吗? –

+0

对我而言,个别字节为负值似乎很可能。所有字节的一半都是负数。目前还不清楚你是否完全描述了这个问题。 –

回答

0

帕斯卡当量的Java longInt64,你也需要改变字节顺序;例如

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是帕斯卡无符号类型)。

+0

非常感谢,完美的解决方案。 –

+0

我不是很热衷于此。我认为这是网络转换的主机,并使用htonll。 –