2012-02-19 81 views
8

Vì vậy, những gì tôi đang cố gắng làm ở đây là lấy float[], chuyển đổi nó thành byte[], gửi nó qua mạng dưới dạng gói dữ liệu và sau đó chuyển nó trở lại a byte[] tại thiết bị đầu cuối nhận.Chuyển đổi float [] thành byte [] thành float [] lần nữa

Bây giờ tôi biết tôi có thể chuyển đổi float[] thành byte[] bằng cách sử dụng phương thức getBytes[]. Nhưng tôi không biết cách đảo ngược chuyển đổi.

+0

trả lời độc đáo ở đây: http://stackoverflow.com/a/19624671/534347 –

Trả lời

9

Tôi nghĩ rằng bạn muốn tận dụng các lớp ByteBuffer, trong đó có putFloatgetFloat phương pháp.

+0

Cảm ơn! Tôi nghĩ rằng đây là nó. Tôi sẽ cung cấp cho nó một đi khi tôi nhận được thời gian và tôi sẽ cho bạn biết những gì sẽ xảy ra. – brain56

+1

@ brain56: chỉ muốn thêm rằng nếu bạn đang gửi điều này qua mạng, bạn sẽ muốn chỉ định rõ ràng mã hóa thay vì để bản thân bạn ở lòng thương xót của mã hóa mặc định của nền tảng. –

+1

ByteBuffer cũng có phương thức asFloatBuffer() trong trường hợp bạn không muốn trích xuất các giá trị riêng lẻ, bạn có thể chuỗi các lời gọi phương thức: ByteBuffer.wrap (someByteArray) .asFloatBuffer(). Array() để đi từ một byte [] đến một float [] –

2

Sử dụng Float.floatToIntBits() để trích xuất giá trị bit của phao dưới dạng số nguyên, sau đó sử dụng BigInteger.toByteArray() để tạo một byte[]. Điều này có thể được đảo ngược bằng cách sử dụng hàm tạo BigInteger có đối số byte[] và sau đó là Float.intBitsToFloat().

5

... Một cách khác sử dụng ByteArrayOutputStream/DataOutputStream cho đầu ra

float fArr[] = ...; 
ByteArrayOutputStream bas = new ByteArrayOutputStream(); 
DataOutputStream ds = new DataOutputStream(bas); 
for (float f : fArr) 
    ds.writeFloat(f); 
byte[] bytes = bas.toByteArray(); 

Sử dụng ByteArrayInputStream/DataInputStream cho đầu vào

byte[] buffer = ...; 
ByteArrayInputStream bas = new ByteArrayInputStream(buffer); 
DataInputStream ds = new DataInputStream(bas); 
float[] fArr = new float[buffer.length/4]; // 4 bytes per float 
for (int i = 0; i < fArr.length; i++) 
{ 
    fArr[i] = ds.readFloat(); 
} 
+0

Lợi ích của chương trình là gì? – ricosrealm

+0

không có phương thức như writeFloat - mã của bạn chỉ đơn giản là không biên dịch – pzo

+1

cảm ơn vì đã chỉ ra nó, tôi đã cập nhật mã với đúng lớp bộ điều hợp tại chỗ. – ricosrealm

0

Tên người gửi:

ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 
// byteBuffer reused for every element in floatArray 
ByteBuffer byteBuffer = ByteBuffer.allocate(4); 
// go through the elements in the float array writing its 
// byte equivalent to the stream 
for(float element : floatArray) { 
    byteBuffer.clear(); 
    byteBuffer.putFloat(element) 
    byteStream.write(byteBuffer.array()); 
} 

// Logic for sending bytestream's bytes as datagram packet 
// can get byte[] from steam by: byteStream.toByteArray(); 

Receiver:

ArrayList<Float> receivedValues = new ArrayList<Float>(); 
ByteBuffer byteBuffer = ByteBuffer.wrap(receivedBytes); 

// while there is still 4 bytes left on the byte buffer 
// grab the next float and add it to the received list 
int position = 0; 
while(byteBuffer.capactiy - position >= 4) { 
    receivedValues.add(byteBuffer.getFloat(position)); 
    position += 4; 
} 

float[] result = new float[receivedValues.count]; 
return receivedValues.toArray(new float[receivedValues.size()]); 
0

Bạn cần sử dụng các lệnh getFloat() và putFloat() trong FloatBuffer của ByteBuffer. Trong thực tế, bạn chắc chắn nên làm điều này đơn giản chỉ vì tốc độ tuyệt đối. Và đó là một điều tuyệt vời để hiểu về thao tác byte. Bạn cũng có thể trộn và kết hợp dữ liệu và đặt và nhận dữ liệu khi cần. Tất cả đều được hỗ trợ bởi bộ đệm byte. Vì vậy, xảy ra phổ biến của việc gửi một mảng, bạn cần phải gửi kích thước của mảng quá.

public static void writeFloatArray(float[] array, OutputStream stream) throws IOException { 
    ByteBuffer buffer = ByteBuffer.allocate(4 * (array.length + 1)).putInt(array.length); 
    buffer.asFloatBuffer().put(array,0,array.length); 
    stream.write(buffer.array()); 
} 

Bạn chỉ cần đảm bảo phân bổ đủ byte để lưu trữ mọi thứ trong bộ đệm. Viết một số nội dung, viết một số nội dung khác, v.v. Hiểu điểm này giúp mọi thứ trở nên dễ dàng hơn. Ngày Flipside chúng tôi về cơ bản là giống nhau, mặc dù chúng tôi cần thêm một đọc bởi vì chúng tôi không biết làm thế nào lớn mảng là, chỉ có thể có một:

public static float[] readFloatArray(InputStream in) throws IOException { 
    byte[] data = new byte[4]; 
    if (readFully(in, data) != data.length) return null; 
    int length = ByteBuffer.wrap(data).getInt(); 
    data = new byte[length * 4]; 
    if (readFully(in,data) != data.length) return null; 
    float[] array = new float[length]; 
    ByteBuffer.wrap(data).asFloatBuffer().get(array,0,array.length); 
    return array; 
} 

Và đối với chức năng đầy đủ, mặc dù không chính xác phần điều này:

public static int readFully(InputStream in, byte[] data) throws IOException { 
    int offset = 0; 
    int bytesRead; 
    boolean read = false; 
    while ((bytesRead = in.read(data, offset, data.length - offset)) != -1) { 
     read = true; 
     offset += bytesRead; 
     if (offset >= data.length) { 
      break; 
     } 
    } 
    return (read) ? offset : -1; 
} 
Các vấn đề liên quan