c#中未处理的异常,Destination数组不够长,无法复制集合中的所有项

本文关键字:复制 集合 不够 异常 未处理 Destination 数组 | 更新日期: 2023-09-27 17:51:11

我是c#初学者,并试图读取二进制文件来计算binary filesymbolsfrequency。(频率是符号重复出现的次数)。

在我采取的第一步中,我将"symbol"data type读取为"int",并且代码运行良好。但现在我想让这个符号 generic type (我的意思是<T>类型)。

代码在ubuntu终端编译时没有任何错误。

但是当我使用"mono filename.exe BinaryFile.bin"执行时,这个二进制文件在sole argument读取。请最后看看我是如何得到这个二进制文件的toto.bin。

错误是:

hp@ubuntu:~/Desktop/Internship_Xav/templatescplus$ mono test.exe toto.bin 
Unhandled Exception: System.ArgumentException: Destination array is not long enough to copy all the items in the collection. Check array index and length.
  at System.BitConverter.PutBytes (System.Byte* dst, System.Byte[] src, Int32 start_index, Int32 count) [0x00000] in <filename unknown>:0 
  at System.BitConverter.ToInt64 (System.Byte[] value, Int32 startIndex) [0x00000] in <filename unknown>:0 
  at shekhar_final_version_Csharp.Huffman`1[System.Int64]..ctor (System.String[] args, System.Func`3 converter) [0x00000] in <filename unknown>:0 
  at shekhar_final_version_Csharp.MyClass.Main (System.String[] args) [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentException: Destination array is not long enough to copy all the items in the collection. Check array index and length.
  at System.BitConverter.PutBytes (System.Byte* dst, System.Byte[] src, Int32 start_index, Int32 count) [0x00000] in <filename unknown>:0 
  at System.BitConverter.ToInt64 (System.Byte[] value, Int32 startIndex) [0x00000] in <filename unknown>:0 
  at shekhar_final_version_Csharp.Huffman`1[System.Int64]..ctor (System.String[] args, System.Func`3 converter) [0x00000] in <filename unknown>:0 
  at shekhar_final_version_Csharp.MyClass.Main (System.String[] args) [0x00000] in <filename unknown>:0 
hp@ubuntu:~/Desktop/

我的完整代码是(缩小代码):

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace Final 
{
    public class A < T > where T: struct, IComparable < T > , IEquatable < T > 
    {
        public class Node 
        {
            public T symbol;
            public Node next;
            public int freq;
        } public Node Front;
        public A(string[] args, Func < byte[], int, T > converter) 
        {    
            int size = Marshal.SizeOf(typeof (T));
            Front = null;
            using(var stream = new BinaryReader(System.IO.File.OpenRead(args[0]))) 
            {   
                while (stream.BaseStream.Position < stream.BaseStream.Length) 
                {   
                    byte[] bytes = stream.ReadBytes(size);   
                    T processingValue = converter(bytes, 0);  
                    Node pt, temp;
                    pt = Front;
                    while (pt != null) 
                    {   Console.WriteLine("check1");
                        if (pt.symbol.Equals(processingValue)) 
                        {
                            pt.freq++;
                            break;
                        }
                        Console.WriteLine("Symbol : {0}  frequency is : {1}", pt.symbol, pt.freq);
                        temp = pt;
                        pt = pt.next;
                    }
                }
            }
        }
    }    //////////////////////////////////////////////////
    public class MyClass 
    {
        public static void Main(string[] args) 
        {
            A < long > ObjSym = new A < long > (args, BitConverter.ToInt64);
        }
    }
}

我认为这个问题是在public class MyClass中创建Huffman类型对象时创建的。是否有人可以帮助我如何通过给出解决方案来摆脱这个问题(任何一段代码都会非常感激)?谢谢。

c#中未处理的异常,Destination数组不够长,无法复制集合中的所有项

如果文件的大小不是8字节(64位),则最后一个ReadBytes()将导致byte[]小于8字节,从而导致ToInt64()失败。