【问题标题】:Store data from byte array into queue then convert to char array将字节数组中的数据存储到队列中,然后转换为字符数组
【发布时间】:2019-03-19 13:05:24
【问题描述】:

我一直在尝试将字节数组存储到队列中,然后当队列达到一定长度以清空队列并将所有内容转换为 char 数组。但是,执行此操作时我没有收到任何输出。使用队列后它是空的有什么原因吗?谢谢。

char 数组作为字节发送到 C# 应用程序:

char Str[10] = {'a','b','c','d','e','f','g','h','i','j'};

名为Str的字符数组在到达应用程序之前被转换为字节并成为数据

void Update()
{
    Queue<byte> myQueue = new Queue<byte>();
    Debug.Log("datalength: " + data.Length);
    byte[] byteArray = new byte[data.Length];
    if (data.Length == 20)
    {
        for (int i = 0; i < data.Length; i++)
        {
            myQueue.Enqueue(data[i]);
            byteArray[i] = myQueue.Dequeue();
        }
    }

    Debug.Log("byteArrayLength: " + byteArray.Length);
    char[] charArray = System.Text.Encoding.UTF8.GetString(byteArray, 0, 20).ToCharArray();
    string s = PrintCharArray(charArray);
}

public static string PrintCharArray(char[] chars)
{
    var sb = new StringBuilder("new byte[] { ");
    foreach (var b in chars)
    {
        sb.Append(b + ", ");
        Debug.Log(b.ToString());
    }
    sb.Append("}");


        return sb.ToString();
    }

【问题讨论】:

  • 使用队列后什么是空的?当然,Dequeue() 之后的队列是空的。
  • 您确实意识到您的队列总是空的,因为您在入队之后将其出列,对吗?你的 for 循环所做的就是将数据从 data 复制到 byteArray
  • 另外,只有当你收到一个包含 20 个元素的数组时,你才会做一些事情。您可能没有得到任何结果,因为您收到的数组包含多于或少于 20 个元素。基于Str 是 10 个元素,这就是为什么它是空的
  • Update 中的 for 循环以零长度队列结束。 Enqueue 添加一个项目,然后 Dequeue 删除该项目。因此,当 for 循环结束时,队列中没有任何项目。

标签: c# arrays unity3d char queue


【解决方案1】:

您的代码有很多错误。

  1. 每次执行Update 方法时,您都在重新声明myQueue,清除以前的数据。您必须在方法外部声明和初始化它,或者作为static,作为类的成员,或者将它的引用传递给Update
  2. 您的代码仅在您收到数据数组中的 20 个元素时运行,但您收到 10 个
  3. 您的循环只是将元素从一个数组复制到另一个数组,而不是使用队列

所以这是一个固定的代码

static Queue<byte> myQueue = new Queue<byte>();

void Update()
{
    Debug.Log("datalength: " + data.Length);

    for (int i = 0; i < data.Length; i++)
    {
        myQueue.Enqueue(data[i]);        
    }

    if (myQueue.Count == 20)
    {

        byte[] byteArray = new byte[myQueue.Count];
        for (int i = 0; i < byteArray.Length; i++)
        {
            byteArray[i] = myQueue.Dequeue();
        }

        Debug.Log("byteArrayLength: " + byteArray.Length);
        char[] charArray = System.Text.Encoding.UTF8.GetString(byteArray, 0, byteArray.Length).ToCharArray();
        string s = PrintCharArray(charArray);

    }    
}

【讨论】:

  • 谢谢,我正在从 Arduino 发送 char 数组,数据数组变为 20,因为 C# char 是 2 个字节,而 Arduino char 是 1 个字节。我想在队列中有 20 个容量,但我想我会先检查一下。当我打印 data.Length 时,我的输出长度为 20。
  • @ConradAddo 所以......你试过我的解决方案了吗?你遇到了什么问题?
猜你喜欢
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 2012-09-07
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多