2012-11-28 86 views
-1

可能重复:
Convert an array of different value types to a byte array如何将浮点数组转换为字节数组?

我有6个浮标,我需要把它们放在彩车的数组,然后将它们转换为字节。这里我们去:

float x= g.transform.position.x; 
float y= g.transform.position.y; 
float z= g.transform.position.z; 
float alpha = g.transform.rotation.eulerAngles.x; 
float theta = g.transform.rotation.eulerAngles.y; 
float phi = g.transform.rotation.eulerAngles.z; 

什么是将浮点数组转换为字节数组的最佳方法?

+4

http://stackoverflow.com/questions/1385829/convert-an-array-of-different-value-types-to-a-byte-array?rq=1 – Reddy

+0

你可以多说一点目标这个的?特别是你想要的那种排列顺序? – CodesInChaos

+0

@CodesInChaos,目标是浮动到一个数组,浮点数组到字节的数组并发送该字节的数组通过UDP大endianness,有一个想法如何做到这一点? –

回答

0

如果本地排序和LINQ是可以接受的,L.B的回答很好。如果你想保持一致(小)字节顺序,使用BinaryWriter

using(var stream = new MemoryStream()) 
using(var writer = new BinaryWriter(stream)) 
{ 
    writer.Write(x); 
    writer.Write(y); 
    ... 
    return stream.ToArray(); 
} 

如果你想使用大字节序,你可以使用下面的辅助方法:

byte[] GetBytesBigEndian(float f) 
{ 
    var bytes = BitConverter.GetBytes(f); 
    if(BitConverter.IsLittleEndian) 
    Array.Reverse(bytes); 
    return bytes; 
} 

using(var stream = new MemoryStream()) 
using(var writer = new BinaryWriter(stream)) 
{ 
    writer.Write(GetBytesBigEndian(x)); 
    writer.Write(GetBytesBigEndian(y)); 
    ... 
    return stream.ToArray(); 
} 

如果真是太慢了,也有几个技巧可以加快它的速度。

+0

有没有办法使用这种方法没有LINQ? –

+0

@TTTaker添加了一个不依赖于LINQ的版本。 – CodesInChaos

2
byte[] data = new float[]{x,y,z,alpha,theta,phi} 
        .SelectMany(f => BitConverter.GetBytes(f)).ToArray(); 

或(取决于消费者的计算机体系结构)

byte[] data = new float[]{x,y,z,alpha,theta,phi} 
       .SelectMany(f => BitConverter.GetBytes(f).Reverse()).ToArray(); 

您可能还需要使用BitConverter.IsLittleEndian来决定选择哪一个作为@CodesInChaos建议

+0

请注意,这使用本机排序,并且不适合持久性存储或网络通信。 – CodesInChaos

+0

@CodesInChaos我已经建议序列化技术,并在他之前的问题中给OP一个例子。 –

+0

如果有一点与大端排序有关,上面的解决方案会显示一个错误,指出Type'float []'不包含'SelectMany'的定义并且没有扩展方法'SelectMany'可以找到类型'float []'(你是否缺少using指令或程序集引用?) –

0
float[] source = new float[100]; 
byte[] dest = new byte[source.Length * sizeof(float)]; 
Buffer.BlockCopy(source, 0, dest, 0, dest.Length); 
0

尝试类似:

var farray = new float[] {12.4f, 12.3f, 4.5f}; // or what ever values you want. 
var bArray = new byte[farray.Length]; 
Buffer.BlockCopy(farray, 0, bArray, 0, bArray.Length); 
     foreach (byte value in bArray) 
      Console.Write("{0} ", value); 

欲了解更多信息,请访问MSDN

希望这会有所帮助。

+0

是否有可能通过数组列表来做到这一点? –

0

这里有一个厚脸皮的方式:

float x = 1F; 
float y = 2F; 
float z = 3F; 
float alpha = 4F; 
float theta = 5F; 
float phi = 6F; 
byte[] raw = new byte[6 * sizeof(float)]; 
fixed (byte* ptr = raw) 
{ 
    float* typed = (float*)ptr; 
    typed[0] = x; 
    typed[1] = y; 
    typed[2] = z; 
    typed[3] = alpha; 
    typed[4] = theta; 
    typed[5] = phi; 
} 
return raw; 

但是请注意,它使字节排列顺序assunptions。您可能需要检查BitConverter.IsLittleEndian并在需要时反转每个4字节块。

当然,如果您可以重新使用现有的缓冲区,那更好。同样的方法 - 只需传入一个现有的byte[]作为参数,而不是每次都创建一个新参数。

+0

哦..我不能使用不安全的比赛 –

相关问题