当前位置: 首页 > 知识库问答 >
问题:

C#1D字节数组到2D双数组

史飞尘
2023-03-14

我正在处理C#并发队列和多线程在套接字编程TCP/IP

首先,我已经完成了套接字编程本身。这意味着,我已经完成了关于客户机、服务器和通信本身的编码

到目前为止,我已经实现了putting_data到queue1(Thread1)和全部出列(Thread2),其速度大约是700Mbps

我使用两个concurrent_queue的原因是,我希望通信和类型转换工作在后台处理,而不考虑有关控制的主要过程。

下面是关于我自己的concurrent_queue的代码

public class BlockingConcurrentQueue<T> : IDisposable
    {
        private readonly ConcurrentQueue<T> _internalQueue;
        private AutoResetEvent _autoResetEvent;
        private long _consumed;
        private long _isAddingCompleted = 0;
        private long _produced;
        private long _sleeping;

        public BlockingConcurrentQueue()
        {
            _internalQueue = new ConcurrentQueue<T>();
            _produced = 0;
            _consumed = 0;
            _sleeping = 0;
            _autoResetEvent = new AutoResetEvent(false);
        }
        public bool IsAddingCompleted
        {
            get
            {
                return Interlocked.Read(ref _isAddingCompleted) == 1;
            }
        }
        public bool IsCompleted
        {
            get
            {
                if (Interlocked.Read(ref _isAddingCompleted) == 1 && _internalQueue.IsEmpty)
                    return true;
                else
                    return false;
            }
        }
        public void CompleteAdding()
        {
            Interlocked.Exchange(ref _isAddingCompleted, 1);
        }
        public void Dispose()
        {
            _autoResetEvent.Dispose();
        }
        public void Enqueue(T item)
        {
            _internalQueue.Enqueue(item);

            if (Interlocked.Read(ref _isAddingCompleted) == 1)
                throw new InvalidOperationException("Adding Completed.");

            Interlocked.Increment(ref _produced);
            if (Interlocked.Read(ref _sleeping) == 1)
            {
                Interlocked.Exchange(ref _sleeping, 0);
                _autoResetEvent.Set();
            }
        }
        public bool TryDequeue(out T result)
        {
            if (Interlocked.Read(ref _consumed) == Interlocked.Read(ref _produced))
            {
                Interlocked.Exchange(ref _sleeping, 1);
                _autoResetEvent.WaitOne();
            }
            if (_internalQueue.TryDequeue(out result))
            {
                Interlocked.Increment(ref _consumed);
                return true;
            }
            return false;
        }
    }

有没有什么快速的方法可以将一维字节数组合并成二维双数组的形式,并对其进行排队?

谢谢你的帮助!

共有1个答案

唐焕
2023-03-14

我试图理解你的转换规则,所以我写了这个转换代码。使用parallel加快计算速度。

int maxSize = 65536;
byte[] dim1Array = new byte[maxSize];
for (int i = 0; i < maxSize; ++i)
{
    dim1Array[i] = byte.Parse((i % 256).ToString());
}

int dim2Row = 40;
int dim2Column = 3500;
int byteToDoubleRatio = 8;
int toDoubleSize = maxSize / byteToDoubleRatio;
double[,] dim2Array = new double[dim2Row, dim2Column];
Parallel.For(0, toDoubleSize, i =>
{
    int row = i / dim2Column;
    int col = i % dim2Column;
    int originByteIndex = row * dim2Column * byteToDoubleRatio + col * byteToDoubleRatio;
    dim2Array[row, col] = BitConverter.ToDouble(
        dim1Array,
        originByteIndex);
});
 类似资料:
  • 问题内容: 我正在尝试连接4个数组,一个1D形状的数组(78427,)和3个2D形状的数组(78427,375/81/103)。基本上,这是4个数组,具有78427个图像的特征,其中1D数组每个图像仅具有1个值。 我尝试串联数组,如下所示: 这将导致以下错误: 追溯(最近一次调用):文件“”,第1行,在ValueError中:所有输入数组的维数必须相同 问题似乎是一维数组,但是我真的看不出来为什么

  • 问题内容: 对于数组中也是数组中的每个元素,我想将值设置为0,这将创建数组 我知道有一种使用和将其作为1D数组进行广播的方法,但是我不知道该如何进行。 任何帮助将不胜感激。 问题答案: 如果将切片的2D数组馈入到其中,它将把它展平为1D数组并与之进行比较,从而创建一个1D蒙版,可以对其进行整形并用于对该切片数组进行布尔索引以将元素设置为。单线实施看起来像这样- 样品运行- 为了简化操作,您可以创建

  • 问题内容: 我尝试运行如下代码: 我认为的形状应为(1,3)而不是(3,)。 矩阵返回的结果应为: 数组([[23],[53],[83]]) 不 数组([23,53,83]) 为什么会发生结果? 问题答案: 顾名思义,该函数的主要目的是通过在两个形状相同的数组上执行 传统的线性代数点积 来提供标量结果。 鉴于这一主要目的,在文档中也对这种情况下的第一(第一子弹下方点)谈到: 您的案件已在他的评论的

  • 在这里,我试图将转换为一个1D数组。

  • 本文向大家介绍在Python中将2d numpy数组展平为1d数组,包括了在Python中将2d numpy数组展平为1d数组的使用技巧和注意事项,需要的朋友参考一下 2d numpy数组是数组的数组。在本文中,我们将看到如何展平它以使元素成为一维数组。 与扁平化 numpy中的flatten函数是将2d数组转换为1D数组的直接方法。 示例 输出结果 运行上面的代码给我们以下结果- 带旅行 还有一

  • 问题内容: 我有2个1d数组,而我正在尝试将它们填充到JAVA中的单个2d数组中。 例如: 结果应为: 我该怎么办?我目前有这样的事情: 我有点被困在那里… 问题答案: 2D数组是数组的数组。那你为什么不试试这个呢? 为了确保它是如此简单并且可以正常工作,请进行以下测试: