在C#中计算二进制文件的符号频率不起作用,但适用于等效的C ++代码

s

我正在尝试计算中的二进制文件中符号的频率c#,我已经在c ++中做到了这一点,并且可以正常工作,并且我已经从c ++切换到c#,因为我必须在c#中实现相同的频率

注意:我不必使用LUT /数组,而仅需使用链表。

通过frequency符号的重复我的意思是数量,并通过symbols我的意思是,如果我们看到使用的二进制文件xxd -b BinaryFile.bin,然后我们会得到很多8 bits的组合01因此,每个符号重复多少次是它的频率。

现在,我如何尝试做到这一点:c#通过mono filename.exe BinaryFile.bin在终端使用在notepad ++内以文件名编写的代码来实现此目的

逻辑:如果不重复,则读取BinaryFile中的每个符号,然后将其添加到链表的末尾;如果重复,则增加其频率。我重复完整的二进制文件。

代码:

C#代码(完整):(无法正常工作,我指出了代码中包含部分内容的问题,我放入完整代码,因为可能您会需要它):

  ////Problem containing part starts here ////////
        public Huffman(string[] args) //called from MyClass 
        {
            Node tree = null;
            int counter = 0;
            using(var stream = new BinaryReader(System.IO.File.OpenRead(args[0]))) 
            {
                while (stream.BaseStream.Position < stream.BaseStream.Length) 
                {
                    int processingValue = stream.ReadByte();
                    Node ppt, pt, temp;
                    bool is_there = false;
                    ppt = pt = tree;
                    while (pt != null) 
                    {
                        if (pt.symbol == processingValue) 
                        {
                            pt.freq++;
                            is_there = true;

                            break;
                        }
                        ppt = pt;
                        pt = pt.next;
                    }
                    if (is_there == false) 
                    {
                        temp = new Node();
                        temp.symbol = processingValue;
                        temp.freq = 1;
                        temp.left = null;
                        temp.right = null;
                        temp.next = null;
                        temp.id = (++total_nodes);
                        temp.is_processed = 0;
                        if (tree == null) 
                        {
                            tree = temp;
                        } 
                        else 
                        {
                            ppt.next = temp;
                        }
//The same check/debugging which i was doing in c++ to know what symbol and freq contains but they contains different values. 
//And the output of both c#/c++ are different where as it was supposed to be same.
                        Node chc = tree;
                        while (chc != null) 
                        {
                            Console.WriteLine("  sym: " + chc.symbol);
                            Console.WriteLine("  freq: " + chc.freq);
                            chc = chc.next;
                        }
                    }
                }
                stream.Close();
            }


        }
 ////Problem containing part Ends here ////////

C ++和c#的输出之间的区别:

(1)当我显示c ++的输出时,它可以正常工作;当我看到我在代码中编写的代码部分以调试/检查终端上的输出时,该部分表明了代码的正确执行。而在c#中,相同的调试代码在c ++中不会显示相同的输出。之所以这样做,是因为这两个用于打印“符号”和“频率”的代码都保存在程序中的同一位置。

(2)C#的输出使我感到,虽然在c#中执行循环的次数比在c ++中执行循环的次数少,因为在c#输出端子中没有显示大量的频率和符号重复。请查看两者的输出:

终端上的C#输出:

hp@ubuntu:~/Desktop/$ mono check1.exe out.bin 
  sym: 0
  freq: 1
  sym: 0
  freq: 200
  sym: 1
  freq: 1
  sym: 0
  freq: 200
  sym: 1
  freq: 198
  sym: 2
  freq: 1
  sym: 0
  freq: 200
  sym: 1
  freq: 198
  sym: 2
  freq: 195
  sym: 3
  freq: 1
  sym: 0
  freq: 200
  sym: 1
  freq: 198
  sym: 2
  freq: 195
  sym: 3
  freq: 189
  sym: 4
  freq: 1
hp@ubuntu:~/Desktop/

而的输出c++是:(此处计数器的值实际上是从“ 0”(不是“ 196”)开始的),但由于文件较大,所以输出无法显示全部,因此无法显示全部输出,它只显示最后的输出)

    hp@ubuntu:~/Desktop/$ ./filename out.bin

  //Counter starts from "0" but terminal is not able to show all.So doing from "196"
    counter: 196
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  1
    counter: 197
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  2
    counter: 198
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  3
    counter: 199
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  4
    counter: 200
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  5
    counter: 201
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  6
    counter: 202
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  7
    counter: 203
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  8
    counter: 204
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  9
    counter: 205
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  10
    counter: 206
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  11
    counter: 207
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  12
    counter: 208
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  13
    counter: 209
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  14
    counter: 210
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  15
    counter: 211
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  16
    counter: 212
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  17
    counter: 213
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  18
    counter: 214
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  19
    counter: 215
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  20
    counter: 216
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  21
    counter: 217
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  22
    counter: 218
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  23
    counter: 219
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  24
    counter: 220
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  25
    counter: 221
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  26
    counter: 222
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  27
    counter: 223
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  28
    counter: 224
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  29
    counter: 225
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  30
    counter: 226
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  31
    counter: 227
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  32
    counter: 228
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  33
    counter: 229
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  34
    counter: 230
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  35
    counter: 231
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  36
    counter: 232
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  37
    counter: 233
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  38
    counter: 234
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  39
    counter: 235
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  40
    counter: 236
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  41
    counter: 237
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  42
    counter: 238
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  43
    counter: 239
      sym:  0
      freq:  50
      sym:  1
      freq:  50
      sym:  2
      freq:  48
      sym:  3
      freq:  48
      sym:  4
      freq:  44

问题:

(1)为什么c#代码显示的输出与c ++不同?甚至我也品尝过相同的BinaryFile(在我的情况下是out.bin)。

(2)您能帮我解决这个问题吗?十分感谢

马修·沃森(Matthew Watson)

我可能完全误解了这一点……您是否只是想知道指定文件中每个字节值(0..255)的出现次数?

如果是这样,一个简单的方法是这样的:

var counts = new int[256];  // Assumes files aren't longer than 2GB.

string filename = "<Your filename goes here>";

foreach (byte b in File.ReadAllBytes(filename)) // Will run out of memory
    ++counts[b];                                // for very large files!

for (int i = 0; i < counts.Length; ++i)
    Console.WriteLine("Symbol {0} occurred {1} times.", i, counts[i]);

但是,这比您正在做的事情简单得多,我觉得我一定会误会...。


[编辑]

我无法修复您的原始代码,但这是一个示例程序,该示例程序使用链接列表来解决此问题:

using System;
using System.IO;

namespace ConsoleApp1
{
    public sealed class Node
    {
        public byte Symbol { get; set; }
        public int Count   { get; set; }
        public Node Next   { get; set; }
    }

    sealed class Program
    {
        private void run()
        {
            var linkedList = new Node();

            string filename = @"C:\Test\t.cs";

            foreach (byte symbol in File.ReadAllBytes(filename))
                addSymbol(symbol, linkedList);

            for (int symbol = 0; symbol < 256; ++symbol)
            {
                int count = countForSymbol((byte)symbol, linkedList);
                Console.WriteLine("Symbol {0} occurred {1} times.", symbol, count);
            }
        }

        private static void addSymbol(byte symbol, Node head)
        {
            Node last = head;

            while (head != null)
            {
                last = head;

                if (head.Symbol == symbol)
                {
                    ++head.Count;
                    return;
                }
                else
                {
                    head = head.Next;
                }
            }

            last.Next = new Node
            {
                Symbol = symbol, 
                Count = 1
            };
        }

        private int countForSymbol(byte symbol, Node head)
        {
            while (head != null)
            {
                if (head.Symbol == symbol)
                    return head.Count;
                else
                    head = head.Next;
            }

            return 0;
        }

        private static void Main()
        {
            new Program().run();
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么将EXE文件转换为二进制代码,添加到C并重新创建,为什么不起作用?

为什么此线性和二进制搜索基准代码不起作用?

为什么我的二进制到英语代码不起作用?

如何将二进制文件头示例代码(C ++ / C#)转换为Python?

C ++字符串到二进制代码/二进制代码到字符串

从单个C源代码生成库和二进制文件

在 Swift 中读取二进制 (.hgt) 文件(将代码从 C++ 迁移到 swift)

C中的数字频率计算代码不起作用

用于本地二进制模式的Matlab代码

从源代码构建python而不为二进制文件创建符号链接

编写从二进制到十进制的转换形式-我的代码不起作用?(JavaScript和HTML5)

从二进制文件获取代码转储

从 Julia 代码创建生产就绪的二进制文件

代码样式,无需修改二进制文件

代码库的哪些部分使二进制文件很大?

签名二进制文件(不是代码签名)

压缩不包括二进制文件的源代码

执行二进制代码

模拟QEMU的二进制代码

霍夫曼代码二进制(java)?

二进制堆排序代码

存储过程不适用于c#代码

使用getc()和putc()在C语言中复制文件文本-输出文件中的二进制代码

如何识别数字是C中的二进制代码还是十进制

负十进制到二进制C代码

如何将库链接到我的C代码并在Rust二进制文件中使用它?

python代码功能不适用于数学测验,并且密码不起作用

我的 C++ 代码不起作用(用于类声明)

我在 C 二进制搜索代码中做错了什么?(迭代和递归)