Est-il possible d'écrire la représentation sur 8 octets d'un nombre double en C#, puis de lire ces 8 octets en Java comme le même nombre double qui a été codé ?
Réponses
Trop de publicités?Oui, Java et .NET utilisent tous deux des représentations IEEE-754, bien que Java puisse omettre certains drapeaux. La question principale ici est l'endianness, et il est trivial de l'inverser si nécessaire. Par exemple, en .NET, vous pouvez gérer cela comme suit :
double value = ...
byte[] bytes = BitConverter.GetBytes(value);
et :
byte[] bytes = ...
double value = BitConverter.ToDouble(bytes);
El endiveté détermine quel octet va en premier/dernier, mais pour passer de l'un à l'autre, il suffit d'inverser le tableau ; par exemple, si vous voulez du "big-endian", vous pouvez convertir avec :
if(BitConverter.IsLittleEndian) {
Array.Reverse(bytes);
}
(en se rappelant de le faire à la fois en lisant et en écrivant)
J'ai bien peur de ne pas connaître le java pour la même chose, mais il est certainement entièrement disponible - je soupçonne ByteBuffer.putDouble
/ ByteBuffer.getDouble
serait un bon début.
Vous pouvez écrire un double sous forme de texte ou de binaire et l'écrire en utilisant C#, Java et des dizaines de langages et vous pouvez également le lire dans un nombre illimité de langages. Je ne connais pas le lolcode ;)
le même double numéro qui a été encodé ?
Techniquement, il n'est pas encodé si vous utilisez le format natif, car il s'agit de la valeur binaire telle qu'elle est utilisée, c'est-à-dire qu'aucune traduction n'est nécessaire pour l'utiliser.
Pour lire un double
Pour lire ou écrire dans le format natif, je suggère d'utiliser ByteBuffer en définissant l'ordre des octets sur LITTLE_ENDIAN.
Par exemple, pour utiliser la représentation IEEE-754 que votre CPU et la plupart des langages prennent en charge (car le CPU effectue la majeure partie du travail réel).
byte[] bytes = new byte[8];
ByteBuffer bb = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN);
double d = bb.getDouble();
// or
bb.putDouble(d);