2

Je suis en train de lire un tableau de 16 octets (byte[16]) à partir d'un JDBC ResultSet avec rs.getBytes("id") et maintenant j'ai besoin de le convertir en deux valeurs longues. Comment puis je faire ça?Comment convertir un tableau d'octets en deux valeurs longues?

C'est le code que j'ai essayé, mais je n'ai probablement pas utilisé ByteBuffer correctement.

byte[] bytes = rs.getBytes("id"); 
System.out.println("bytes: "+bytes.length); // prints "bytes: 16" 

ByteBuffer buffer = ByteBuffer.allocate(16); 
buffer = buffer.put(bytes); 

// throws an java.nio.BufferUnderflowException 
long leastSignificant = buffer.getLong(); 
long mostSignificant = buffer.getLong(); 

Je stocké le tableau d'octets à la base de données en utilisant:

byte[] bytes = ByteBuffer.allocate(16) 
    .putLong(leastSignificant) 
    .putLong(mostSignificant).array(); 

Répondre

4

Vous pouvez faire

ByteBuffer buffer = ByteBuffer.wrap(bytes); 
long leastSignificant = buffer.getLong(); 
long mostSignificant = buffer.getLong(); 
+0

+1 Ah, c'était plus beau. Merci. – Jonas

2

Vous devez réinitialiser le ByteBuffer en utilisant la méthode flip() après avoir inséré les octets en elle (permettant ainsi à la getLong() appelle à lire dès le début - offset 0):

buffer.put(bytes);  // Note: no reassignment either 

buffer.flip(); 

long leastSignificant = buffer.getLong(); 
long mostSignificant = buffer.getLong(); 
+0

Merci, qui a fonctionné parfaitement. – Jonas

1
long getLong(byte[] b, int off) { 
    return ((b[off + 7] & 0xFFL) << 0) + 
      ((b[off + 6] & 0xFFL) << 8) + 
      ((b[off + 5] & 0xFFL) << 16) + 
      ((b[off + 4] & 0xFFL) << 24) + 
      ((b[off + 3] & 0xFFL) << 32) + 
      ((b[off + 2] & 0xFFL) << 40) + 
      ((b[off + 1] & 0xFFL) << 48) + 
      (((long) b[off + 0]) << 56); 
} 

long leastSignificant = getLong(bytes, 0); 
long mostSignificant = getLong(bytes, 8); 
1

Essayez ceci:

LongBuffer buf = ByteBuffer.wrap(bytes).asLongBuffer(); 
long l1 = buf.get(); 
long l2 = buf.get(); 
Questions connexes