【问题标题】:calculate numbers in array (run length decoding)计算数组中的数字(运行长度解码)
【发布时间】:2021-03-24 22:01:33
【问题描述】:
        int[] bytes = new int[9] { 123, 5, 65, 123, 6, 77, 123, 4, 101 };       
        int count = 1;          
        for (int i = 1; i < bytes.Length; i++)
        {
            
            if (bytes[i] == 123)
            {
                count++;              
            }
            else
            {
                Console.WriteLine(bytes[i]);
            }
        }
        Console.ReadLine();

我是编程初学者。 123 是某种“标记”
我不知道如何进行这样的控制台输出:65 65 65 65 65 77 77 77 77 77 77 101 101 101 101
我会很感激任何帮助

【问题讨论】:

  • "我不知道如何进行这样的控制台输出:65 65 65 65 65 77 77 77 77 77 77 101 101 101 101" 老实说,我也不知道。这是某种run-length-encoding 吗?无论如何,您的问题到底是什么?什么有效,什么无效?你从上面的代码中实际得到的结果是什么?
  • 如果是游程编码,你肯定需要先得到你想要重复的次数,然后再得到要重复的字节吗?这些是不同的元素,所以第一次迭代会给你想要多少,然后第二次会给你重复的字节。然后你需要一个循环来重复那个字节的次数。

标签: c# arrays decoding run-length-encoding


【解决方案1】:

要解码任何东西,你真的需要一个关于该东西是什么的规范。在这种情况下,我可以推测:

  • 123 表示“以下两个字节 X 和 Y 应被解释为有效载荷 Y 的 X 个实例 (0-255)”

所以你会解析一个字节,如果它不是 123:放弃,因为你没有任何其他规则要遵循,否则,读X和 Y,并输出值 Y 的 X 个副本

在伪代码中:

while(TryTakeByte(out val)))
    switch val
        123:
            if (!TryTakeByte(out x) || !TryTakeByte(out y)) FailEndOfStream()
            for (i from 0 to x)
                write y
        default:
            FailNoClueWhatToDo() // refer to protocol specification

【讨论】:

  • “在这种情况下,我可以推测:”我们真的应该这样做吗?
  • @HimBromBeere 只要我们指出这是猜测,并注意我们真的应该检查规范所说的内容:当然
  • "如果不是 123:放弃,因为你没有任何其他规则要遵循" - 基于标志的 RLE 的标准是遇到与标志不匹配的任何内容模式可以被认为是未压缩的,应该简单地复制。我的意思是,否则,即使 拥有 字节 123 也没有意义;如果所有预期数据都是长度-值对,则您将不需要 任何标记。
猜你喜欢
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多