Удаление конечных нулей из байтового массива в 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.
- конечные нули, вероятно, связаны с записью всего буфера в файл, а не только используемой части буфера. У м ...
Ответ #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 это сделать.
- Только если обязательно нужно скопировать данные :) Еще один вариант - рассматривать его как массив более широкого типа, например. 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 критическая часть.
Ответ #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
- Только что протестировал это против решения @ 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
Ответ #5
Ответ на вопрос: Удаление конечных нулей из байтового массива в C#
Предполагая, что 0 = null, это, вероятно, ваш 9X_c#-language лучший выбор ... в качестве небольшой настройки 9X_.cs-file вы можете использовать Buffer.BlockCopy
, когда вы, наконец, скопируете 9X_c# полезные данные ..
Ответ #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#
-
7
-
8
-
3
-
12
-
5
-
3
-
7
-
5
-
3
-
8
-
2
-
3
-
1
-
1
-
4
-
3
-
4
-
2
-
4
-
4
-
4
-
3
-
5
-
6
-
3
-
6
-
5
-
4
-
1
-
6
-
3
-
3
-
2
-
3
-
2
-
1
-
2
-
1
-
4
-
3
-
2
-
1
-
2
-
6
-
2
-
2
-
2
-
5
-
3
-
3