Удаление конечных нулей из байтового массива в C#

Хорошо, я читаю файлы dat в массив байтов. По 9X_.cs-file какой-то причине люди, которые генерируют 9X_bytearray эти файлы, помещают в конец файла бесполезные 9X_c-sharp нулевые байты на полмиегабайта. Кто-нибудь 9X_c#-language знает, как быстро их обрезать?

Первой мыслью 9X_visual-c# было начать с конца массива и повторять 9X_.cs-file в обратном направлении, пока я не найду 9X_csharp что-то, кроме нуля, а затем скопировать 9X_c-sharp все до этого момента, но мне интересно, нет 9X_bytearray ли лучшего способа.

Чтобы ответить на некоторые 9X_c-sharp вопросы: Вы уверены, что в файле определенно 9X_csharp есть 0 байтов, а не в коде чтения файла? Да, я 9X_visual-c# в этом уверен.

Можете ли вы точно обрезать 9X_visual-c# все конечные нули? Да.

Могут ли в остальной 9X_c-sharp части файла присутствовать нули? Да, других 9X_bytearray мест может быть 0, поэтому нет, я не могу 9X_c-sharp начать с начала и останавливаться на первом 9X_.cs-file 0.

17
1

  • конечные нули, вероятно, связаны с записью всего буфера в файл, а не только используемой части буфера. У м ...
6
Общее количество ответов: 6

Ответ #1

Ответ на вопрос: Удаление конечных нулей из байтового массива в C#

Я согласен с Джоном. Критический бит состоит 9X_visual-c# в том, что вы должны «коснуться» каждого 9X_visual-c# байта от последнего до первого ненулевого 9X_c#.net байта. Примерно так:

byte[] foo; // populate foo int i = foo.Length - 1; while(foo[i] == 0) --i; // now foo[i] is the last non-zero byte byte[] bar = new byte[i+1]; Array.Copy(foo, bar, i+1); 

Я почти уверен, что 9X_c-sharp это настолько эффективно, насколько вы сможете 9X_c#-language это сделать.

24
2

  • Только если обязательно нужно скопировать данные :) Еще один вариант - рассматривать его как массив более широкого типа, например. int или long. Для этого, вероятно, потребуется небезопасный код, и вам придется обрабатывать конец массива от ...

Ответ #2

Ответ на вопрос: Удаление конечных нулей из байтового массива в C#

Учитывая, что теперь на дополнительные вопросы 9X_csharp даны ответы, похоже, что вы в основном делаете 9X_c#-language правильные вещи. В частности, вам нужно 9X_c#-language прикоснуться к каждому байту файла, начиная 9X_c-sharp с последнего 0, чтобы убедиться, что в нем 9X_bytearray есть только нули.

Теперь, нужно ли вам копировать 9X_c#.net все или нет, зависит от того, что вы затем 9X_c#.net делаете с данными.

  • Вы могли бы запомнить индекс и сохранить его вместе с данными или именем файла.
  • Вы можете скопировать данные в новый массив байтов.
  • Если вы хотите «исправить» файл, вы можете вызвать FileStream.SetLength, чтобы обрезать файл.

«Вы должны читать каждый байт 9X_c# между точкой усечения и концом файла» - это 9X_c#.net критическая часть.

11
0

Ответ #3

Ответ на вопрос: Удаление конечных нулей из байтового массива в C#

@Factor Mystic,

Думаю, есть кратчайший путь:

var data = new byte[] { 0x01, 0x02, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00 }; var new_data = data.TakeWhile((v, index) => data.Skip(index).Any(w => w != 0x00)).ToArray(); 

9X_c#-language

10
2

  • Только что протестировал это против решения @ Coderer, он приме ...

Ответ #4

Ответ на вопрос: Удаление конечных нулей из байтового массива в C#

Как насчет этого:

[Test] public void Test() { var chars = new [] {'a', 'b', '\0', 'c', '\0', '\0'}; File.WriteAllBytes("test.dat", Encoding.ASCII.GetBytes(chars)); var content = File.ReadAllText("test.dat"); Assert.AreEqual(6, content.Length); // includes the null bytes at the end content = content.Trim('\0'); Assert.AreEqual(4, content.Length); // no more null bytes at the end // but still has the one in the middle } 

9X_csharp

4
0

Ответ #5

Ответ на вопрос: Удаление конечных нулей из байтового массива в C#

Предполагая, что 0 = null, это, вероятно, ваш 9X_c#-language лучший выбор ... в качестве небольшой настройки 9X_.cs-file вы можете использовать Buffer.BlockCopy, когда вы, наконец, скопируете 9X_c# полезные данные ..

2
0

Ответ #6

Ответ на вопрос: Удаление конечных нулей из байтового массива в C#

проверьте это:

 private byte[] trimByte(byte[] input) { if (input.Length > 1) { int byteCounter = input.Length - 1; while (input[byteCounter] == 0x00) { byteCounter--; } byte[] rv = new byte[(byteCounter + 1)]; for (int byteCounter1 = 0; byteCounter1 < (byteCounter + 1); byteCounter1++) { rv[byteCounter1] = input[byteCounter1]; } return rv; } 

9X_c#

1
0