Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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#相当于从现有数组创建的javascript类型Darray';缓冲区?_Javascript_C#_Typedarray - Fatal编程技术网

C#相当于从现有数组创建的javascript类型Darray';缓冲区?

C#相当于从现有数组创建的javascript类型Darray';缓冲区?,javascript,c#,typedarray,Javascript,C#,Typedarray,我正在尝试将javascript函数转换为C#脚本。javascript版本所做的一件事是从现有Float32Array的.buffer创建UINT32数组 有人知道这在C#中的等价物是什么吗?我说的不是C语言中的Float32Array和Uint32Array,我说的是javascript类型的数组使用来自dst变量的缓冲区进行初始化的方式(参见代码)。。。这一点很重要,因为其他数组稍后会使用(例如)var dstUint32=new uint32数组(dst.buffer)初始化 这是代码(

我正在尝试将javascript函数转换为C#脚本。javascript版本所做的一件事是从现有Float32Array的.buffer创建UINT32数组

有人知道这在C#中的等价物是什么吗?我说的不是C语言中的Float32Array和Uint32Array,我说的是javascript类型的数组使用来自dst变量的缓冲区进行初始化的方式(参见代码)。。。这一点很重要,因为其他数组稍后会使用(例如)var dstUint32=new uint32数组(dst.buffer)初始化

这是代码(src是一个现有的Float32Array-请参阅下面的一些初始值)

这就是在控制台中分别为DStunit32和dst记录的数字,这些数字设置为src(该函数不能仅处理这些数字,因为正如我所说,实际数组要长得多),有趣的是,几乎没有一个数字与原始数组匹配

[20, 20, 1062378438, 3, 0, 6, 1641, 61341710, 3279494571, 2109, 30670862, 1140399531, 1024093127, 1062632131, 0, 6, 469, 61341714, 3263430756, 475, 61341702, 1128661142, 1041959952, 1061140142, 0, 6, 1639, 138018831, 3278731586, 2341, 46006287, 1144134386, 1035496386, 1059271173, 1088330890, 16, 0, 6, 1409, 92012546, 3290042412, 2111, 46006274, 1150947372, 1032712617, 4294967295, 4294967295, 0, 4294967295, 4294967295, 4294967295, 0, 4294967295, 4294967295, 4294967295, 0, 4294967295, 4294967295, 4294967295, 0, 4294967295, 4294967295, 4294967295, 0, 4294967295]


[2.802596928649634e-44, 2.802596928649634e-44, 0.822689414024353, 4.203895392974451e-45, 0, 8.407790785948902e-45, 2.2995307799570248e-42, 9.874165102541455e-37, -249.1158905029297, 2.955338461261039e-42, 7.787657921469055e-38, 498.2317810058594, 0.03379419073462486, 0.8378106951713562, 0, 8.407790785948902e-45, 6.572089797683392e-43, 9.874168689865524e-37, -66.00076293945312, 6.656167705542881e-43, 9.874157927893318e-37, 198.00228881835938, 0.1514132022857666, 0.7488812208175659, 0, 8.407790785948902e-45, 2.2967281830283752e-42, 5.597240788537616e-34, -237.47366333007812, 3.280439704984397e-42, 2.7918024463192472e-37, 712.4210205078125, 0.09004928171634674, 0.6374819874763489, 6.956608772277832, 2.2420775429197073e-44, 0, 8.407790785948902e-45, 1.9744295362336673e-42, 1.1848984491218286e-35, -616.252685546875, 2.958141058189689e-42, 2.7917995316184414e-37, 1232.50537109375, 0.06930858641862869, NaN, NaN, 0, NaN, NaN, NaN, 0, NaN, NaN, NaN, 0, NaN, NaN, NaN, 0, NaN, NaN, NaN, 0, NaN]
所以你可以看到这里的代码

dstUint32[0] = src[0];
dstUint32[1] = src[1];
似乎已将DSTUNT32[0]/DSTUNT32[1]和dst[0]/dst[1]设置为某个值,只是在dst[0]/dst[1]中,该值被记录为2.802596928649634e-44,而不是20?

  • js
    UInt32数组的等价物是
    UInt32[]
  • js
    Float32Array
    的等价物是
    float[]
  • ArrayBuffer
    等效的是
    byte[]
JavaScript类型的数组是数组缓冲区中的视图。因此,UINT32数组中的元素不会强制转换为浮点,而是将物理存储器的内容(位)重新解释为浮点

要在C#中做到这一点,您需要做以下几件事情之一

如果您想共享阵列缓冲区

如果您关心共享arraybuffer,即您需要在一个数组中进行更改以立即显示在另一个数组中,那么您需要实现整个过程。C#没有提供这种开箱即用的服务。为了实现它,您需要使用
InteropServices.Marshal
工具。这些将允许您访问底层内存

如果您不想共享阵列缓冲区

如果您只想在一个方向上转换,那么以后可能会再次转换回来,但您不需要立即看到更改,也不需要使用共享的ArrayBuffer,您的工作会更轻松

  • 创建一个MemoryStream
  • 从数组中写入Float32元素
  • 阅读UInt32元素
大概是这样的:

    static byte[] ReinterpretAsByteArray(UInt32[] a)
    {
        using (MemoryStream s = new MemoryStream())
        {
            using (BinaryWriter w = new BinaryWriter(s, Encoding.Unicode, true))
            {
                for (int i = 0; i < a.Length; i++)
                {
                    w.Write(a[i]);
                }
            }
            return s.ToArray();
        }
    }
    static float[] ReinterpretAsFloatArray(byte[] b) {
        using (MemoryStream s = new MemoryStream(b, false)) {
            using (BinaryReader r = new BinaryReader(s, Encoding.Unicode, true))
            {
                float[] f = new float[b.Length / 4]; // 4 = sizeof float
                for (int i = 0; i < b.Length; i++)
                {
                    f[i] = r.ReadSingle();
                }
                return f;
            }
        }
    }    
静态字节[]重新解释字节数组(UInt32[]a)
{
使用(MemoryStream s=new MemoryStream())
{
使用(BinaryWriter w=新的BinaryWriter(s,Encoding.Unicode,true))
{
for(int i=0;i
您需要编写一个类似的函数来将字节数组转换为Uint32数组,并将浮点数组转换为字节数组,但这需要更改两行。

  • js
    UInt32数组的等价物是
    UInt32[]
  • js
    Float32Array
    的等价物是
    float[]
  • ArrayBuffer
    等效的是
    byte[]
JavaScript类型的数组是数组缓冲区中的视图。因此,UINT32数组中的元素不会强制转换为浮点,而是将物理存储器的内容(位)重新解释为浮点

要在C#中做到这一点,您需要做以下几件事情之一

如果您想共享阵列缓冲区

如果您关心共享arraybuffer,即您需要在一个数组中进行更改以立即显示在另一个数组中,那么您需要实现整个过程。C#没有提供这种开箱即用的服务。为了实现它,您需要使用
InteropServices.Marshal
工具。这些将允许您访问底层内存

如果您不想共享阵列缓冲区

如果您只想在一个方向上转换,那么以后可能会再次转换回来,但您不需要立即看到更改,也不需要使用共享的ArrayBuffer,您的工作会更轻松

  • 创建一个MemoryStream
  • 从数组中写入Float32元素
  • 阅读UInt32元素
大概是这样的:

    static byte[] ReinterpretAsByteArray(UInt32[] a)
    {
        using (MemoryStream s = new MemoryStream())
        {
            using (BinaryWriter w = new BinaryWriter(s, Encoding.Unicode, true))
            {
                for (int i = 0; i < a.Length; i++)
                {
                    w.Write(a[i]);
                }
            }
            return s.ToArray();
        }
    }
    static float[] ReinterpretAsFloatArray(byte[] b) {
        using (MemoryStream s = new MemoryStream(b, false)) {
            using (BinaryReader r = new BinaryReader(s, Encoding.Unicode, true))
            {
                float[] f = new float[b.Length / 4]; // 4 = sizeof float
                for (int i = 0; i < b.Length; i++)
                {
                    f[i] = r.ReadSingle();
                }
                return f;
            }
        }
    }    
静态字节[]重新解释字节数组(UInt32[]a)
{
使用(MemoryStream s=new MemoryStream())
{
使用(BinaryWriter w=新的BinaryWriter(s,Encoding.Unicode,true))
{
for(int i=0;i    static byte[] ReinterpretAsByteArray(UInt32[] a)
    {
        using (MemoryStream s = new MemoryStream())
        {
            using (BinaryWriter w = new BinaryWriter(s, Encoding.Unicode, true))
            {
                for (int i = 0; i < a.Length; i++)
                {
                    w.Write(a[i]);
                }
            }
            return s.ToArray();
        }
    }
    static float[] ReinterpretAsFloatArray(byte[] b) {
        using (MemoryStream s = new MemoryStream(b, false)) {
            using (BinaryReader r = new BinaryReader(s, Encoding.Unicode, true))
            {
                float[] f = new float[b.Length / 4]; // 4 = sizeof float
                for (int i = 0; i < b.Length; i++)
                {
                    f[i] = r.ReadSingle();
                }
                return f;
            }
        }
    }