c#中未处理的异常,Destination数组不够长,无法复制集合中的所有项
本文关键字:复制 集合 不够 异常 未处理 Destination 数组 | 更新日期: 2023-09-27 17:51:11
我是c#
初学者,并试图读取二进制文件来计算binary file
内symbols
的frequency
。(频率是符号重复出现的次数)。
在我采取的第一步中,我将"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类型对象时创建的。是否有人可以帮助我如何通过给出解决方案来摆脱这个问题(任何一段代码都会非常感激)?谢谢。
如果文件的大小不是8字节(64位),则最后一个ReadBytes()
将导致byte[]
小于8字节,从而导致ToInt64()
失败。