Calculating frequency of symbols of binary file in c# not working but working for equivalent c++ code -
i trying calculate frequency of symbols in binary file in c#, have done in c++ , works fine , have switched c# c++ because have implement same in c#.
note: don't have use luts/arrays linkedlist must used.
by frequency mean number of repetitions of symbols , symbols mean if see binary file using xxd -b binaryfile.bin lot of 8 bits of combinations of 0 , 1. how many times each symbol repeats it's frequency.
now, how have tried so: achieve in c# doing mono filename.exe binaryfile.bin @ terminal code written in filename inside notepad++.
logic: read each symbol in binaryfile if not repeated add @ tail of linked list , if repeated increase it's frequency. repeat full binary file.
code:
code c# (full): (which don't work properly, have pointed problem containing part in code, put full code because may need it):
////problem containing part starts here //////// public huffman(string[] args) //called 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 doing in c++ know symbol , freq contains contains different values. //and output of both c#/c++ different supposed 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 //////// difference between output of c++ , c#:
(1) when display output of c++ works correctly , when see code part have written in code debug/check output on terminal shows correct execution of code. whereas same debugging code in c# don't show same output c++. supposed because both of these code print "symbol" , "freq" kept @ same place in program.
(2) output of c# makes me feel while loop executed less number of times in c# in c++ because in c# output terminal don't show large amount repetition of freq , symbol. please see output of both :
c# output @ terminal :
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/ whereas output of c++ : (here value of counter started form "0" (not "196") not able show full output because file larger output big terminal not able show all, shows output @ end)
hp@ubuntu:~/desktop/$ ./filename out.bin //counter starts "0" terminal not able show all.so doing "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 questions:
(1) why output shown c# code different c++ ? have tasted on same binaryfile (out.bin in case).
(2) please me in coming out of problem ? big thanks
i might totally misunderstanding this... wanting know number of occurrences of each byte value (0..255) within specified file?
if so, simple way this:
var counts = new int[256]; // assumes files aren't longer 2gb. string filename = "<your filename goes here>"; foreach (byte b in file.readallbytes(filename)) // run out of memory ++counts[b]; // large files! (int = 0; < counts.length; ++i) console.writeline("symbol {0} occurred {1} times.", i, counts[i]); however, simpler you're doing feel must misunderstanding....
[edit]
i can't fix original code, here's sample program works uses linked-list solve problem:
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); (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(); } } }
Comments
Post a Comment