Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中将字节数组转换为双数组?_C#_.net_Bytearray - Fatal编程技术网

如何在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

我有一个包含双值的字节数组。我想把它转换成双数组。在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 = 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]);   
}