C# 如何将字节[]数据复制到非常大的浮点[]中?

C# 如何将字节[]数据复制到非常大的浮点[]中?,c#,copy,C#,Copy,我正在尝试将byte[]数据复制到float[]中,如下所示: float[] floatArr = new float[int32.MaxValue]; byte[] byteArr = new byte[bufferSize]; // fill buffer Buffer.BlockCopy(byteArr, 0, floatArr, 0, bufferSize); 这很好,因为我正在将其复制到目标数组的开头。 但是如何将数据复制到大于int32.MaxValue的索引中 long pos

我正在尝试将byte[]数据复制到float[]中,如下所示:

float[] floatArr = new float[int32.MaxValue];
byte[] byteArr = new byte[bufferSize];
// fill buffer
Buffer.BlockCopy(byteArr, 0, floatArr, 0, bufferSize);
这很好,因为我正在将其复制到目标数组的开头。 但是如何将数据复制到大于int32.MaxValue的索引中

long pos = (int32.MaxValue * sizeof(float) - 1) - bufferSize; // copy to the end of the array
Buffer.BlockCopy(byteArr, 0, floatArr, pos, bufferSize); // Buffer.BlockCopy() does not accept long as destination index

要使用Buffer.MemoryCopy,您可以执行以下操作:

int bufferSize = 4096;
// The maximum size is 2146435071
// see https://docs.microsoft.com/it-it/dotnet/framework/configure-apps/file-schema/runtime/gcallowverylargeobjects-element
// And the page is even wrong. If maximum index is 2146435071,
// then maximum size should be 2146435071 + 1
float[] floatArr = new float[2146435071];
byte[] byteArr = new byte[bufferSize];

int ix = 0;

fixed (float* fl = floatArr)
fixed (byte* b = byteArr)
{
    while (ix < floatArr.Length)
    {
        // Read data to byteArr;
        int bytesRead = ReadToBuffer(byteArr);

        //bytesRead must be divisible by sizeof(float), so divisible by 4

        float* fl2 = fl + ix;
        Buffer.MemoryCopy(b, fl2, bytesRead, bytesRead);
        ix += bytesRead / 4;
    }
}
int bufferSize=4096;
//最大尺寸为2146435071
//看https://docs.microsoft.com/it-it/dotnet/framework/configure-apps/file-schema/runtime/gcallowverylargeobjects-element
//这一页甚至是错的。如果最大索引为2146435071,
//那么最大大小应该是2146435071+1
float[]floatArr=新的float[2146435071];
byte[]byteArr=新字节[bufferSize];
int ix=0;
固定(浮动*fl=floatArr)
固定(字节*b=byteArr)
{
while(ix<浮动arr.长度)
{
//将数据读取到byteArr;
int bytesRead=ReadToBuffer(byteArr);
//字节读取必须可以被sizeof(float)整除,因此可以被4整除
浮点数*fl2=fl+ix;
缓冲存储器拷贝(b,fl2,字节读,字节读);
ix+=字节读取/4;
}
}

请注意,该方法必须标记为
不安全
,并且您必须允许程序中存在不安全代码(这是项目中的一个选项)

您的计算机上有多少内存?Mmmh。。。这里有
缓冲区。MemoryCopy
。。。但是它需要
void*
,所以不安全的代码。。。很遗憾,您发现了一个丢失的API。。。您可以拥有多达
uint.MaxValue
元素的数组,但有许多API不支持此参数的非响应:如果确实需要,您可以始终手动复制数据
BitConverter.ToSingle()
,一次一个浮点。@xanatos我看到了Buffer.MemoryCopy选项,但我不知道如何将浮点[]转换为空*。(void*)bytear不起作用