2016-08-01 4 views
0

S'il vous plaît aidez-moi à traduire le code Java en Pascal.Comment faire pour convertir des Tbytes long-à-deux, big-endian dans delphi

Commentaire: préparer des données ici, 8 octets sont utilisés pour le compteur de chiffre d'affaires (plus que suffisant pour chaque chiffre d'affaires possible ...), cependant la spécification ne nécessite que 5 octets au minimum. compteur, qui est représenté par deux complément de 8 octets, la représentation big endian (égale à Java LONG), les octets 8-15 sont mis à 0 les valeurs négatives sont possibles (très rare)

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 données. putLong intéressé par Pascal

Merci.

+0

Java écrit un 'long' (pas un' Long') comme 8 octets dans Big Endian par défaut. –

+0

"la spécification ne requiert que 5 octets", à quoi penses-tu? 5 octets, peux-tu clarifier ce que tu veux dire? –

+0

Les octets individuels étant négatifs me semble probable. La moitié de tous les octets sont négatifs. Il n'est pas clair que vous avez complètement décrit le problème. –

Répondre

0

L'équivalent Pascal de Java long est Int64, et vous devez également modifier l'endianness; par exemple

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; 

Notez également que byte est un type signé en Java, il est équivalent direct dans Pascal est ShortInt (Byte est un type non signé Pascal).

+0

Merci beaucoup, solution parfaite. –

+0

Je ne suis pas très enthousiaste à ce sujet. Je considérerais ceci comme un hôte à la conversion de réseau et utiliser htonll. –