【问题标题】:C# element in byte array fails to be initialize, null byte fails to initialize字节数组中的C#元素初始化失败,空字节初始化失败
【发布时间】:2014-09-17 18:39:23
【问题描述】:
byte checksum;
byte[] toBuff = new byte[20];
toBuff = BitConverter.GetBytes(intNumBuffer);      
Array.Reverse(mybyte);
checksum = ComputeChecksum(toBuff); //int to byte array

// At this point, the array is something like this
//  toBuff[0] = 25
//  toBuff[1] = 0
//  toBuff[2] = 0
//  toBuff[3] = 0

toBuff[4] = checksum; //HERE IS WHERE OUR OF BOUNDS OCCURS

我是新手,非常感谢任何帮助。

谢谢

【问题讨论】:

  • 你想做什么?

标签: c# bytearray indexoutofboundsexception


【解决方案1】:
toBuff = BitConverter.GetBytes(intNumBuffer);

BitConverter.GetBytes() 的调用返回一个长度为4 的字节数组,因为intNumBuffer 是一个大小为4 的int

所以,这意味着toBuff 的有效索引是 0、1、2 和 3。因此使用索引 4 时会出错。

现在,我想你在写作时想象过:

byte[] toBuff = new byte[20];

toBuff 的长度为 20。嗯,现在确实如此。但是当您随后覆盖toBuff 时,您将拥有一个新的不同数组。

大概你需要做的如下:

byte[] toBuff = new byte[20];
Array.Copy(BitConverter.GetBytes(intNumBuffer), toBuff, sizeof(int)); 

或许:

byte[] toBuff = new byte[20];
byte[] intBytes = BitConverter.GetBytes(intNumBuffer);
Array.Copy(intBytes, toBuff, intBytes.Length); 

其中任何一个都会将调用GetBytes()返回的位复制到toBuff

【讨论】:

  • 感谢您的回答。我只有一个问题,这是否意味着我的数组大小发生了变化,并且该数组的内存更改为 4 个字节而不是 20 个字节,其他 16 个字节是否返回到空闲内存。
  • 不,您创建了一个新数组。 toBuff 是一个参考。
【解决方案2】:

这是正常的,因为您只添加了 0 到 3 范围内的项目。 您可以先检查 toBuff[someIndex] 是否确实有一个值,因此不为空。

【讨论】:

    【解决方案3】:

    BitCONverter.GetBytes 返回一个包含 4 个校验码的数组:http://msdn.microsoft.com/en-us/library/de8fssa4(v=vs.110).aspx

        toBuff = BitConverter.GetBytes(intNumBuffer);      
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 2016-03-25
      • 2012-11-17
      • 2017-12-10
      • 2018-09-17
      • 1970-01-01
      • 2018-10-13
      相关资源
      最近更新 更多