如何在C#中将字节数组转换为双数组?
我有一个包含双值的字节数组。我想把它转换成双数组。在C#中可能吗 字节数组如下所示:如何在C#中将字节数组转换为双数组?,c#,.net,bytearray,C#,.net,Bytearray,我有一个包含双值的字节数组。我想把它转换成双数组。在C#中可能吗 字节数组如下所示: byte[] bytes; //I receive It from socket double[] doubles;//I want to extract values to here 我用这种方式创建了一个字节数组(C++): 无法转换数组类型;然而: byte[] bytes = ... double[] values = new double[bytes.Length / 8]; for(int i
byte[] bytes; //I receive It from socket
double[] doubles;//I want to extract values to here
我用这种方式创建了一个字节数组(C++):
无法转换数组类型;然而:
byte[] bytes = ...
double[] values = new double[bytes.Length / 8];
for(int i = 0 ; i < values.Length ; i++)
values[i] = BitConverter.ToDouble(bytes, i * 8);
应该这样做。您也可以在unsafe
code:
byte[] bytes = ...
double[] values = new double[bytes.Length / 8];
unsafe
{
fixed(byte* tmp = bytes)
fixed(double* dest = values)
{
double* source = (double*) tmp;
for (int i = 0; i < values.Length; i++)
dest[i] = source[i];
}
}
byte[]bytes=。。。
double[]值=新的double[bytes.Length/8];
不安全的
{
固定(字节*tmp=字节)
固定(双*dest=值)
{
双*源=(双*)tmp;
for(int i=0;i
我不确定我是否建议您这样做,不过我将从这里添加对超级不安全代码的引用 请注意,它基于C#的一个未记录的“特性”,所以明天它可能会消亡
[StructLayout(LayoutKind.Explicit)]
struct UnionArray
{
[FieldOffset(0)]
public byte[] Bytes;
[FieldOffset(0)]
public double[] Doubles;
}
static void Main(string[] args)
{
// From bytes to floats - works
byte[] bytes = { 0, 1, 2, 4, 8, 16, 32, 64 };
UnionArray arry = new UnionArray { Bytes = bytes };
for (int i = 0; i < arry.Bytes.Length / 8; i++)
Console.WriteLine(arry.Doubles[i]);
}
[StructLayout(LayoutKind.Explicit)]
结构联合数组
{
[字段偏移量(0)]
公共字节[]字节;
[字段偏移量(0)]
公开双人[]双打;
}
静态void Main(字符串[]参数)
{
//从字节到浮点-有效
byte[]bytes={0,1,2,4,8,16,32,64};
UnionArray arry=新UnionArray{Bytes=Bytes};
对于(int i=0;i
这种方法的唯一优点是它不会真正“复制”数组,因此它在空间和时间上都是O(1),而不是复制O(n)数组的其他方法。转换很容易,但解释却不容易。你想要哪种语言?像C++或JavaScript这样更好的语言?就这一点而言,我没有回答这个问题。你会如何使用JavaScript?数组中的字节是如何存储的?你在问一些奇怪的问题……如果数据是big-endian呢?@Marc Garvell我通过file.ReadAllBytes()API读取一个文本文件,然后使用For-loop我刚刚做了doubleArray[I]=byteArray[I];循环结束后,数组的两个内容相同。是的,数组的大小是1000个项目。那么究竟什么时候应该使用位转换器呢?如果上述解决方案有效,@Gabe确实有效;然后他们需要处理这个问题;p@zenwalker我假设数据是IEEE-754编码的双精度,所以有1/8的双精度是字节<代码>双数组[i]=字节数组[i]做了一些更简单的事情,最终会有很多双精度数,它们的整数值在[0-255]@marcGravel true w.r.t一个字节的范围内,但是你还能看到哪里超过了它?总是255字节是有限的,对吗?@MarcGravel很有趣。。。它使用内存页共享吗?否则它不能少于O(n)MSDN声明“正如其名称所示,BlockCopy方法复制一个字节块作为一个整体,而不是一次复制一个字节。”-但是,它是作为
外部实现的,所以我无法告诉您底层实现是什么。我可以想象,它调用了类似于memcpy
@marcGravel的东西,那么整个操作在空间和时间上都是O(n)(在时间上,因为要复制n个字节,你必须复制所有n个字节,因此你必须执行n/k操作,其中是一个常量,是你一次复制的字节数(4或8),并在空间中,因为需要分配第二个大小为n字节的数组)。显然,这比“手动”复制要快。我本希望它能用一种抄写的“肮脏伎俩”:
byte[] bytes = ...
double[] values = new double[bytes.Length / 8];
unsafe
{
fixed(byte* tmp = bytes)
fixed(double* dest = values)
{
double* source = (double*) tmp;
for (int i = 0; i < values.Length; i++)
dest[i] = source[i];
}
}
[StructLayout(LayoutKind.Explicit)]
struct UnionArray
{
[FieldOffset(0)]
public byte[] Bytes;
[FieldOffset(0)]
public double[] Doubles;
}
static void Main(string[] args)
{
// From bytes to floats - works
byte[] bytes = { 0, 1, 2, 4, 8, 16, 32, 64 };
UnionArray arry = new UnionArray { Bytes = bytes };
for (int i = 0; i < arry.Bytes.Length / 8; i++)
Console.WriteLine(arry.Doubles[i]);
}