3 votes

Est-il possible d'écrire un double en C# et de le lire en Java ?

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é ?

7voto

Marc Gravell Points 482669

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.

0voto

Peter Lawrey Points 229686

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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X