2012-10-25 15 views
1

Comment puis-je convertir un tableau double en tableau d'octets en Java? J'ai regardé beaucoup d'autres messages, mais je n'ai pas pu trouver le bon chemin.Convertir double en octet [] tableau

Input = 65.43 
byte[] size = 6 
precision = 2 (this might change based on input) 

expected output (byte[]) = 006543 

Puis-je le faire sans utiliser des fonctions comme doubleToLongBits()?

+0

C'est ce que votre sortie est, mais ce n'est pas très clair à partir de la question. – lynks

+0

Pas exactement, je veux que le point décimal soit enlevé. Si je donne l'entrée 9999.1234, ma sortie devrait être 999912 – swap

Répondre

2
public static byte[] encode(double input, int size, int precision) { 
    double tempInput = input; 

    for (int i = 0; i < precision; i++) tempInput *= 10; 

    int output = (int) tempInput; 

    String strOut = String.format("%0"+size+"d", output); 

    return strOut.getBytes(); 
} 
+0

c'est parfait, mais j'ajouterais aussi un paramètre pour indiquer les paramètres régionaux pour éviter les problèmes, ou. dans la partie décimale de l'entrée – sataniccrow

+0

Ouais mais n'oubliez pas de faire ce travail dans une fonction différente. La fonction que je vous ai donnée prend un double comme entrée, pas une chaîne ... utilisez 'NumberFormat format = NumberFormat.getInstance (Locale.FRANCE))' par exemple si vous obtenez une virgule au lieu d'une période en entrée. (et puis utilisez 'format.parse (inputString) .doubleValue();') N'oubliez pas de vérifier cette réponse :) – durron597

1
double doubleValue = 10.42123; 
DecimalFormat df = new DecimalFormat("#.##"); 
String newDouble = df.format(doubleValue); 
byte[] byteArray = (newDouble.replace(",", "")).getBytes(); 

for (byte b : byteArray) { 
    System.out.println((char)b+""); 
} 
+0

italien local ... donc, comme signe décimal – sataniccrow

12

réel double à byte[] Conversion

double d = 65.43; 
byte[] output = new byte[8]; 
long lng = Double.doubleToLongBits(d); 
for(int i = 0; i < 8; i++) output[i] = (byte)((lng >> ((7 - i) * 8)) & 0xff); 
//output in hex would be 40,50,5b,85,1e,b8,51,ec 

double BCD Conversion

double d = 65.43; 
byte[b] output = new byte[OUTPUT_LENGTH]; 
String inputString = Double.toString(d); 
inputString = inputString.substring(0, inputString.indexOf(".") + PRECISION); 
inputString = inputString.replaceAll(".", ""); 
if(inputString.length() > OUTPUT_LENGTH) throw new DoubleValueTooLongException(); 
for(int i = inputString.length() - 1; i >= 0; i--) output[i] = (byte)inputString.charAt(i) 
//output in decimal would be 0,0,0,0,6,5,4,3 for PRECISION=2, OUTPUT_LENGTH=8 
+0

Le second est ce que vous avez demandé, le Le premier est ce que j'ai commencé à taper avant votre commentaire, pensé que je l'incluais quand même. – lynks

+0

Bon travail, j'imagine que la première chose est ce que la grande majorité des 13.602 spectateurs sont venus voir. – Caelum

0

C'est ce que je me suis basé sur vos entrées et cela sert mon but. Merci d'avoir aidé! Etes-vous en train de créer un décimal codé en binaire?

static int formatDoubleToAscii(double d, int bytesToUse, int minPrecision, byte in[], int startPos) { 

     int d1 = (int)(d * Math.pow(10, minPrecision)); 

     String t = String.format("%0"+bytesToUse+"d", d1).toString(); 
     System.out.println("d1 = "+ d1 + " t="+ t + " t.length=" + t.length()); 

     for(int i=0 ; i<t.length() ; i++, startPos++) { 
      System.out.println(t.charAt(i)); 
      in[startPos] = (byte) t.charAt(i); 
     }   

     return startPos; 
    }