Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除bytearray C中的尾随零#_C# - Fatal编程技术网

C# 删除bytearray C中的尾随零#

C# 删除bytearray C中的尾随零#,c#,C#,我有一个代码,它使用Marshal.Copy将字节[]写入文件,如下所示。 根据我在调试时观察到的情况,某些值可能在字节数组中包含零 例如: [0] 113 [1] 70 [2] 57 [3] 172 [4] 70 [5] 0 [6] 165 [7] 0 [8] 224 [9] 48 [10] 136 您可以看到字节[5]和字节[7]是零 问题在于从内存中读回字节[]时。现有代码如下所示 因为byte[]buffer=新字节[MAX_DATA_SIZE]用全零初始化。现有代码正在尝试删除尾随。

我有一个代码,它使用Marshal.Copy将字节[]写入文件,如下所示。 根据我在调试时观察到的情况,某些值可能在字节数组中包含零

例如:

[0] 113
[1] 70
[2] 57
[3] 172
[4] 70
[5] 0
[6] 165
[7] 0
[8] 224
[9] 48
[10] 136
您可以看到字节[5]和字节[7]是零

问题在于从内存中读回字节[]时。现有代码如下所示

因为byte[]buffer=新字节[MAX_DATA_SIZE]用全零初始化。现有代码正在尝试删除尾随。但在这个过程中,它也会删除字节[]中的零


如何在字节[]内保留零,但删除尾随的零?正如您在代码中看到的,在从内存读取数据时,我不知道大小。

不如LINQ解决方案漂亮,但它应该更快(我没有测试,也取决于阵列的大小),而无需将阵列反转两次

byte[] withZeroes = new byte[]{ 1,0,1,10,1,1,0,1,5,0,0,0,0,0 }; // Dummy

int indexOfLastNonZero = withZeroes.Length;
while(indexOfLastNonZero != 0 && withZeroes[indexOfLastNonZero-1] == 0)
    indexOfLastNonZero--;

byte[] withoutZeroes = new byte[indexOfLastNonZero];
Array.Copy(withZeroes, withoutZeroes, indexOfLastNonZero); 
// withoutZeroes: 1, 0, 1, 10, 1, 1, 0, 1, 5

不像LINQ解决方案那么漂亮,但它应该更快(我没有测试,也取决于阵列的大小),而不需要将阵列反转两次

byte[] withZeroes = new byte[]{ 1,0,1,10,1,1,0,1,5,0,0,0,0,0 }; // Dummy

int indexOfLastNonZero = withZeroes.Length;
while(indexOfLastNonZero != 0 && withZeroes[indexOfLastNonZero-1] == 0)
    indexOfLastNonZero--;

byte[] withoutZeroes = new byte[indexOfLastNonZero];
Array.Copy(withZeroes, withoutZeroes, indexOfLastNonZero); 
// withoutZeroes: 1, 0, 1, 10, 1, 1, 0, 1, 5
如中所述,您可以使用Linq(亲爱的孩子)。或者你可以用更简单(也更明显)的方法来做,我敢打赌这会比Linq版本更好

可以通过调整大小执行在位“修剪”:

public static void TrimTrailingBytes( ref byte[] buffer , byte trimValue )
{
  int i = buffer.Length ;

  while ( i > 0 && buffer[--i] == trimValue )
  {
    ; // no-op by design
  }

  Array.Resize( ref buffer , i+1 ) ;

  return ;
}
使用方便:

byte[] foo = {0,1,0,2,0,3,0,0,0,0,} ;
TrimTrailingBytes( ref foo , 0 ) ;
产生预期的结果

{0,1,0,2,0,3,}
{0,1,0,2,0,3,}
或者,您可以返回源数组的副本,并将其修剪为以下长度:

static byte[] TrimTrailingBytes( byte[] buffer , byte trimValue )
{
  int i = buffer.Length ;

  while ( i > 0 && buffer[--i] == trimValue )
  {
    ; // no-op by design
  }

  byte[] resized = new byte[i+1] ;
  Array.Copy( buffer , resized , resized.Length ) ;

  return resized ;
}
用法同样简单:

byte[] foo = {0,1,0,2,0,3,0,0,0,0,} ;
byte[] bar = TrimTrailingBytes( foo , 0 ) ;
再次产生预期的结果

{0,1,0,2,0,3,}
{0,1,0,2,0,3,}
如中所述,您可以使用Linq(亲爱的孩子)。或者你可以用更简单(也更明显)的方法来做,我敢打赌这会比Linq版本更好

可以通过调整大小执行在位“修剪”:

public static void TrimTrailingBytes( ref byte[] buffer , byte trimValue )
{
  int i = buffer.Length ;

  while ( i > 0 && buffer[--i] == trimValue )
  {
    ; // no-op by design
  }

  Array.Resize( ref buffer , i+1 ) ;

  return ;
}
使用方便:

byte[] foo = {0,1,0,2,0,3,0,0,0,0,} ;
TrimTrailingBytes( ref foo , 0 ) ;
产生预期的结果

{0,1,0,2,0,3,}
{0,1,0,2,0,3,}
或者,您可以返回源数组的副本,并将其修剪为以下长度:

static byte[] TrimTrailingBytes( byte[] buffer , byte trimValue )
{
  int i = buffer.Length ;

  while ( i > 0 && buffer[--i] == trimValue )
  {
    ; // no-op by design
  }

  byte[] resized = new byte[i+1] ;
  Array.Copy( buffer , resized , resized.Length ) ;

  return resized ;
}
用法同样简单:

byte[] foo = {0,1,0,2,0,3,0,0,0,0,} ;
byte[] bar = TrimTrailingBytes( foo , 0 ) ;
再次产生预期的结果

{0,1,0,2,0,3,}
{0,1,0,2,0,3,}

我发现最好在这类文件中的数据前面加上至少包含结构修订和数据长度的标题。这有助于避免各种问题。在您的例子中,如何处理以零结尾的有效数据?它还允许应用程序通过结构修订来检查数据是否符合他们可以处理的格式。应用程序可以升级旧格式,或者在读取无法处理的文件时(例如,当数据或应用程序从备份中还原时)正常失败。@HABO这是最好的答案。我发现最好在此类文件中的数据前面加上至少包含结构修订和数据长度的头。这有助于避免各种问题。在您的例子中,如何处理以零结尾的有效数据?它还允许应用程序通过结构修订来检查数据是否符合他们可以处理的格式。应用程序可以升级旧格式,或者在读取无法处理的文件时(例如,当数据或应用程序从备份中还原时)正常失败。@HABO这是最好的答案。