C#和Python共享浮点型二维数组

33 篇文章 4 订阅
17 篇文章 1 订阅

 1.创建一个浮点二维数组,并转换为字节数组

        [HttpPost(Name = "SavePLYArrayToMemory")]
        public async Task<string> SavePLYArrayToMemory()
        {
            int count = 10000001;
            Random random = new Random();
            double[,] myArray = new double[count, 3];
            for (int i = 0; i < count; i++)
            {
                myArray[i, 0] = random.NextDouble();
                myArray[i, 1] = random.NextDouble();
                myArray[i, 2] = random.NextDouble();
            }
            
            byte[] s = LinkAsiaSmart.Utils.Utils.ArrayUtil.ConvertToByteArray(myArray);

            Log.Logger.Debug($"保存点云到共享内存 FileName = {GlobalConst.MemoryMap.TireGlueing} Size = {s.Length}  Size = {myArray.Length}");
            MemoryHelper.SaveGluePLYArrayToMemory(GlobalConst.MemoryMap.TireGlueing, s);
 
            return $"result {s.Length} {myArray.Length}";
        }

2.浮点二维数组转字节数组

       public class ArrayUtil
       {
           public static byte[] ConvertToByteArray(double[,] doubleArray)
           {
               int length = doubleArray.Length; // 获取数组总长度
               byte[] byteArray = new byte[length * sizeof(double)]; // 创建字节数组
               int index = 0;

               for (int i = 0; i < doubleArray.GetLength(0); i++) // 假设数组是矩形的
               {
                   for (int j = 0; j < doubleArray.GetLength(1); j++)
                   {
                       double value = doubleArray[i, j];
                       byte[] valueBytes = BitConverter.GetBytes(value);
                       valueBytes.CopyTo(byteArray, index);
                       index += valueBytes.Length;
                   }
               }

               return byteArray;
           } 
       }

3.将字节数组保存到共享内存中

        public static void SaveGluePLYArrayToMemory(string FileName, byte[] msg)
        {
            try
            {
                //# 长度
                long t = msg.Length; // 100;// SetMemorySize(msg);// 100;
                int size = msg.Length / (3*8);
                //# 创建内存块,test1,其他语言利用这个内存块名字就能找到内存块。
                var mmf = MemoryMappedFile.CreateOrOpen(FileName, t, MemoryMappedFileAccess.ReadWrite);
                var viewAccessor = mmf.CreateViewAccessor(0, t);
         
                viewAccessor.WriteArray<byte>(0, msg, 0, size);
    
                // MessageBox.Show("write ok");
 
            }
            catch (System.Exception s)
            {
                MessageBox.Show(s.Message);
            }
        }

4.Python读取共享内存中的二维数组其中array就是读取出来的浮点二维数组


import ast
import copy
import datetime
import os
import random
import sys
import open3d as o3d;
import numpy as np
import pip;
import mmap

from multiprocessing import shared_memory

if __name__ == "__main__": 
    print("version")
    print(sys.path)
    print(o3d.__version__)
    print(sys.version)
    print(sys.executable)
    print(pip.__version__)
    print(pip.__file__)
    print(sys.getwindowsversion())

    try:
 
 
        MemorySize = 240000024
        count = MemorySize //(8*3)

        file_name1 = 'TireGlueing'
        #print(SHMEMSIZE)
        # python读取共享内存
        print(f'1. {datetime.datetime.now()}')
        shmem1 = mmap.mmap(0, MemorySize, file_name1, mmap.ACCESS_READ)

        #shmem1.read_byte

       # np.frombuffer(shmem1, np.uint8)
        array = np.frombuffer(shmem1, dtype=np.double, count=count * 3, offset=0)
        array = array.reshape((count, 3))
        print(array)
 
        
        pointA = np.array(array)
        #print(pointA)

        GlueTopPly = o3d.geometry.PointCloud()
        GlueTopPly.points = o3d.utility.Vector3dVector(pointA)  
        o3d.visualization.draw_geometries([GlueTopPly],
                                            window_name = f"第 1区 " , 
                                            width = 1280, height = 800, left = 50, top = 50) 

  
    except Exception as e:
        print(e)
    print('ok')

    print("version end")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值