2011-01-08 54 views
30

Tôi có một mảng của Floats cần phải được chuyển đổi thành một mảng byte và trở lại một float [] ... bất cứ ai có thể giúp tôi làm điều này một cách chính xác?Làm thế nào để chuyển đổi một mảng float thành một byte [] và ngược lại?

Tôi đang làm việc với lớp bitConverter và thấy mình bị kẹt khi cố gắng nối thêm kết quả.

Lý do tôi làm điều này là vì vậy tôi có thể lưu giá trị thời gian chạy vào luồng IO. Bộ nhớ đích là các khối trang Azure trong trường hợp có vấn đề. Tôi không quan tâm về những gì endian này được lưu trữ trong, miễn là nó đầu vào phù hợp với đầu ra.

static byte[] ConvertFloatToByteArray(float[] floats) 
     { 
      byte[] ret = new byte[floats.Length * 4];// a single float is 4 bytes/32 bits 

      for (int i = 0; i < floats.Length; i++) 
      { 
       // todo: stuck...I need to append the results to an offset of ret 
       ret = BitConverter.GetBytes(floats[i]); 

      } 
      return ret; 
     } 


static float[] ConvertByteArrayToFloat(byte[] bytes) 
{ //to do } 
+0

Bạn có thể làm việc với tuần tự hóa/deserialization đến/từ luồng bộ nhớ không? Sau đó bạn có thể nhận mảng 'byte' từ luồng hoặc xây dựng một luồng từ mảng' byte'. –

+0

Sử dụng phương thức serialization .Net? Tôi không muốn bao gồm bất kỳ XML, và chỉ mất một bit dữ liệu thô ... hệ thống là khá tối ưu hóa và mỗi bit được chiếm ... – LamonteCristo

+0

bạn có thể làm serialization nhị phân thay vì serialization XML: http: // msdn .microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx –

Trả lời

57

Nếu bạn đang tìm kiếm hiệu suất thì bạn có thể sử dụng Buffer.BlockCopy. Đẹp và đơn giản, và có lẽ nhanh như bạn sẽ nhận được trong mã được quản lý.

var floatArray1 = new float[] { 123.45f, 123f, 45f, 1.2f, 34.5f }; 

// create a byte array and copy the floats into it... 
var byteArray = new byte[floatArray1.Length * 4]; 
Buffer.BlockCopy(floatArray1, 0, byteArray, 0, byteArray.Length); 

// create a second float array and copy the bytes into it... 
var floatArray2 = new float[byteArray.Length/4]; 
Buffer.BlockCopy(byteArray, 0, floatArray2, 0, byteArray.Length); 

// do we have the same sequence of floats that we started with? 
Console.WriteLine(floatArray1.SequenceEqual(floatArray2)); // True 
+0

giải pháp tuyệt vời !!!!! Tôi sẽ nhân phao bằng 10000000 và dịch chuyển nó, do đó mất đi một số độ chính xác. Điều này thậm chí còn tốt hơn! – nterry

3

Có phương pháp BitConverter.ToSingle(byte[] value, int startIndex) sẽ giúp ích ở đây.

Trả về một đơn chính xác nổi số điểm quy đổi từ bốn byte tại một vị trí xác định trong một byte mảng.

lẽ bạn muốn một cái gì đó tương tự (chưa được kiểm tra):

static float[] ConvertByteArrayToFloat(byte[] bytes) 
{ 
    if(bytes == null) 
     throw new ArgumentNullException("bytes"); 

    if(bytes.Length % 4 != 0) 
     throw new ArgumentException 
       ("bytes does not represent a sequence of floats"); 

    return Enumerable.Range(0, bytes.Length/4) 
        .Select(i => BitConverter.ToSingle(bytes, i * 4)) 
        .ToArray(); 
} 

EDIT: Không LINQ:

float[] floats = new float[bytes.Length/4]; 

for (int i = 0; i < bytes.Length/4; i++) 
    floats[i] = BitConverter.ToSingle(bytes, i * 4); 

return floats; 
+0

Tôi yêu linq nhiều như tôi không hiểu nó! Đó là rất nhiều! Vì đây sẽ là một chức năng hiệu năng quan trọng, tôi muốn sử dụng một đối tượng mức hệ thống nếu có thể. Phần mở rộng .ToArray() dường như không tồn tại trong dự án dòng lệnh .NET 4 của tôi. Bạn có biết không gian tên? – LamonteCristo

+2

để cải thiện khả năng đọc tôi sẽ thay thế i * 4 bằng i * sizeof (float) – BrokenGlass

+0

@ makerofthings7: Nó nằm trong 'System.Linq.Enumerable'. – Ani

1
static float[] ConvertByteArrayToFloat(byte[] bytes) 
{ 
    if(bytes.Length % 4 != 0) throw new ArgumentException(); 

    float[] floats = new float[bytes.Length/4]; 
    for(int i = 0; i < floats.Length; i++) 
    { 
     floats[i] = BitConverter.ToSingle(bytes, i*4); 
    } 

    return floats; 
} 
4

Bạn đang không di chuyển vị trí khi bạn sao chép float [i] vào mảng byte, bạn nên viết một cái gì đó như

Array.Copy(BitConverter.GetBytes(float[i]),0,res,i*4); 

thay vì chỉ:

ret = BitConverter.GetBytes(floats[i]); 

chức năng nghịch đảo theo cùng một chiến lược.

+0

+1: Có, có vẻ ổn. Tôi đã bỏ lỡ phần này của câu hỏi. – Ani

+0

hmm có vẻ thiếu thông số ... – LamonteCristo

+0

thông số cuối cùng là 4 cho Array.Copy. 1 Tôi sẽ đánh dấu đây là câu trả lời cho câu hỏi (vì nó giải quyết câu hỏi trong tiêu đề), nhưng Ani đã dành rất nhiều thời gian cho câu trả lời của anh ấy. Chỉ có một sự khác biệt 5 điểm anyway ... – LamonteCristo

Các vấn đề liên quan