2010-05-25 14 views
34

एक डबल करने के लिए एक बाइट सरणी परिवर्तित करने के लिए मैं इस पाया:मैं एक बाइट सरणी को डबल और बैक में कैसे परिवर्तित कर सकता हूं?

//convert 8 byte array to double 
int start=0;//??? 
int i = 0; 
    int len = 8; 
    int cnt = 0; 
    byte[] tmp = new byte[len]; 
    for (i = start; i < (start + len); i++) { 
     tmp[cnt] = arr[i]; 
     //System.out.println(java.lang.Byte.toString(arr[i]) + " " + i); 
     cnt++; 
    } 
    long accum = 0; 
    i = 0; 
    for (int shiftBy = 0; shiftBy < 64; shiftBy += 8) { 
     accum |= ((long)(tmp[i] & 0xff)) << shiftBy; 
     i++; 
    } 

     return Double.longBitsToDouble(accum); 

लेकिन मैं जो कुछ भी एक बाइट सरणी में एक डबल बदल जाएगा नहीं पा सके।

+0

आप कितने बाइट पसंद करेंगे? तकनीकी रूप से, बाइट्स की एक सरणी बनाने के लिए यह संभव होगा, उदाहरण के लिए प्रत्येक में केवल एक बिट जानकारी हो। – Pops

+0

पोप्स: मुझे लगता है कि यह कहना उचित है कि ऑक्टैवियन केवल डबल डबल्यू के पूर्ण प्रतिनिधित्व को स्टोर करने के लिए जरूरी बाइट्स की संख्या चाहता है जो आंतरिक डबल प्रतिनिधित्व से मेल खाता है। जावा में, इसकी गणना (int) (Double.Size/Byte.Size) के साथ की जा सकती है। –

उत्तर

12
long bits = Double.doubleToLongBits(myDouble); 
+2

मैंने आपके प्रश्न को देखा - यह एक पूर्ण उत्तर नहीं है - हालांकि, उपरोक्त के समान दृष्टिकोण का उपयोग रिवर्स में किया जा सकता है यदि आप वास्तव में बाइट [] चाहते हैं। – corsiKa

10
public static byte[] toByteArray(double d) { 
    long l = Double.doubleToRawLongBits(d); 
    return new byte[] { 
     (byte)((l >> 56) & 0xff), 
     (byte)((l >> 48) & 0xff), 
     (byte)((l >> 40) & 0xff), 
     (byte)((l >> 32) & 0xff), 
     (byte)((l >> 24) & 0xff), 
     (byte)((l >> 16) & 0xff), 
     (byte)((l >> 8) & 0xff), 
     (byte)((l >> 0) & 0xff), 
    }; 
} 
+2

यह एक अपूर्ण जवाब है - और आप पाएंगे कि समस्या दूसरी छमाही में है; डबल का पुनर्गठन सिर्फ धक्का (int) बी [0] << 56 | (int) बी [1] << 48 | (int) बी [2] << 40 (...) Double.longBitsToDouble() के माध्यम से। बाइटबफर समाधान कहीं अधिक सुरुचिपूर्ण और सिरदर्द मुक्त हैं। – Falkreon

+2

शायद ऐसा है, लेकिन जावा एमई से संभव नहीं है। यह एक कामकाजी समाधान है। धन्यवाद। +1 – Doomsknight

7

कार्यक्षमता पहले से ही एपीआई में कार्यान्वित किया जाता है। एक ByteBuffer में बाइट सरणी लपेटें और प्रयोग ByteBuffer.putLong और ByteBuffer.getLong:

import java.nio.*; 
import java.util.Arrays; 

public class Test { 
    public static void main(String... args) throws Exception { 

     long[] longArray = { 1234, 2345, 3456 }; 

     // Longs to bytes 
     byte[] bytes = new byte[longArray.length * 8]; 
     ByteBuffer buf = ByteBuffer.wrap(bytes); 
     for (long l : longArray) 
      buf.putLong(l); 

     System.out.println(Arrays.toString(bytes)); 

     // Bytes to longs 
     ByteBuffer buf2 = ByteBuffer.wrap(bytes); 
     long[] longs = new long[bytes.length/8]; 
     for (int i = 0; i < longs.length; i++) 
      longs[i] = buf2.getLong(i*8); 

     System.out.println(Arrays.toString(longs)); 

    } 
} 

आउटपुट:

[0, 0, 0, 0, 0, 0, 4, -46, 0, 0, 0, 0, 0, 0, 9, 41, 0, 0, 0, 0, 0, 0, 13, -128] 
[1234, 2345, 3456] 
+0

इसे 'Double.longBitsToDouble' के साथ संयोजित करें और उलटा और उत्तर पूरा हो गया है (ग्लोकोडर का उत्तर)। –

+0

मुझे यह नहीं मिला, मैं डबल और बाइट से जाने पर बिट्स के माध्यम से क्यों जाना चाहूंगा? – aioobe

+0

आप पूरे सरणी को बफर में 'buf.asLongBuffer() के साथ विस्फोट कर सकते हैं। (LongArray); ' – RolKau

87

या भी सरल,

import java.nio.ByteBuffer; 

public static byte[] toByteArray(double value) { 
    byte[] bytes = new byte[8]; 
    ByteBuffer.wrap(bytes).putDouble(value); 
    return bytes; 
} 

public static double toDouble(byte[] bytes) { 
    return ByteBuffer.wrap(bytes).getDouble(); 
} 
+2

यह जानना बहुत अच्छा होगा कि यह प्रदर्शन के लिए हाथ से लिखित रूपांतरण की तुलना में कैसे होता है। –

+1

'वापसी ByteBuffer.wrap (नया बाइट [8])। PutDouble (value) .array() 'पहली विधि को किसी अन्य लाइनर में बदल देता है –

+0

@ क्यूबिकलेटटस दुख की बात है,' सरणी() 'को कुछ भी वापस करने की आवश्यकता नहीं है बैकिंग संरचना को 'बाइट [] 'होने की आवश्यकता नहीं है। यही है, यह उस क्रम में 'असमर्थितऑपरेशन अपवाद' या 'ReadOnlyBufferException' फेंक सकता है। – EntangledLoops

1

मैं वास्तव में ऊपरी और के निचले साथ समस्याओं में भाग डबल, ऐसा लगता है कि मैंने देखा है कि एकमात्र कोड है जो इसके लिए सुधार करता है। मुझे उम्मीद है कि यह दूसरों को इस क्षेत्र में जवाब खोजने में सहायता करता है। यदि आप किसी अन्य कोड के लिए जाते हैं, तो सुनिश्चित करें कि आप मूल्यों की पूरी श्रृंखला का परीक्षण करते हैं, आपको एक लूप लिखना चाहिए जो सभी मानों के लिए और उससे परिवर्तित हो और उन्हें सुनिश्चित करने के लिए जोर दे।

// byte2Double method - extracts doubles from byte array 
// source: http://www.java2s.com/Code/Java/Data-Type/bytetoDouble.htm 
    public static final double[] byte2Double(byte[] inData, boolean byteSwap) { 
    int j = 0, upper, lower; 
    int length = inData.length/8; 
    double[] outData = new double[length]; 
    if (!byteSwap) 
     for (int i = 0; i < length; i++) { 
     j = i * 8; 
     upper = (((inData[j] & 0xff) << 24) 
      + ((inData[j + 1] & 0xff) << 16) 
      + ((inData[j + 2] & 0xff) << 8) + ((inData[j + 3] & 0xff) << 0)); 
     lower = (((inData[j + 4] & 0xff) << 24) 
      + ((inData[j + 5] & 0xff) << 16) 
      + ((inData[j + 6] & 0xff) << 8) + ((inData[j + 7] & 0xff) << 0)); 
     outData[i] = Double.longBitsToDouble((((long) upper) << 32) 
      + (lower & 0xffffffffl)); 
     } 
    else 
     for (int i = 0; i < length; i++) { 
     j = i * 8; 
     upper = (((inData[j + 7] & 0xff) << 24) 
      + ((inData[j + 6] & 0xff) << 16) 
      + ((inData[j + 5] & 0xff) << 8) + ((inData[j + 4] & 0xff) << 0)); 
     lower = (((inData[j + 3] & 0xff) << 24) 
      + ((inData[j + 2] & 0xff) << 16) 
      + ((inData[j + 1] & 0xff) << 8) + ((inData[j] & 0xff) << 0)); 
     outData[i] = Double.longBitsToDouble((((long) upper) << 32) 
      + (lower & 0xffffffffl)); 
     } 

    return outData; 
    } 
3
public static final short byteArrayToShort(byte[] bytes) { 
    return ByteBuffer.wrap(bytes).getShort(); 
} 

public static final int byteArrayToInt(byte[] bytes) { 
    return ByteBuffer.wrap(bytes).getInt(); 
} 

public static final float byteArrayToFloat(byte[] bytes) { 
    return ByteBuffer.wrap(bytes).getFloat(); 
} 

public static double byteArrayToDouble(byte[] bytes) { 
    return ByteBuffer.wrap(bytes).getDouble(); 
} 

public static final long byteArrayToLong(byte[] bytes) { 
    return ByteBuffer.wrap(bytes).getLong(); 
} 

जाओ और आनंद लें।

संबंधित मुद्दे

 संबंधित मुद्दे