Можно использовать dd для извлечения произвольных блоков байтов.
, Например,
dd skip=1234 count=5 bs=1
скопировал бы байты 1235 - 1239 от его входа до его вывода и отбросил бы остальных.
, Чтобы просто получить первые пять байтов от стандартного входа сделайте:
dd count=5 bs=1
Примечание, что, если бы Вы хотите определить входное имя файла, dd имеет старомодный парсинг аргумента, таким образом, Вы сделали бы:
dd count=5 bs=1 if=filename
Примечание также, что dd verbosely объявляет о том, что это, так для отказа от этого, действительно делало:
dd count=5 bs=1 2>&-
или
dd count=5 bs=1 2>/dev/null
Примерно так:
private IList<string> SplitIntoChunks(string text, int chunkSize)
{
List<string> chunks = new List<string>();
int offset = 0;
while (offset < text.Length)
{
int size = Math.Min(chunkSize, text.Length - offset);
chunks.Add(text.Substring(offset, size));
offset += size;
}
return chunks;
}
Или просто для перебора:
private IEnumerable<string> SplitIntoChunks(string text, int chunkSize)
{
int offset = 0;
while (offset < text.Length)
{
int size = Math.Min(chunkSize, text.Length - offset);
yield return text.Substring(offset, size);
offset += size;
}
}
Обратите внимание, что это разбивается на фрагменты кодовых единиц UTF-16, что не совсем то же самое, что разбиение на фрагменты кодовых точек Unicode, которые, в свою очередь, могут отличаться от разделения на блоки глифов.
Хотя на этот вопрос пока есть принятый ответ, вот краткая версия с помощью регулярных выражений. Пуристам это может не понравиться (по понятным причинам), но когда вам нужно быстрое решение и вы умеете работать с регулярными выражениями, это может быть оно. Производительность на удивление неплохая:
string [] split = Regex.Split(yourString, @"(?<=\G.{512})");
Что он делает? Отрицательный взгляд назад и запоминание последней позиции с помощью \ G
. Он также поймает последний бит, даже если он не делится на 512.
с использованием реализации Джона и ключевого слова yield .
IEnumerable<string> Chunks(string text, int chunkSize)
{
for (int offset = 0; offset < text.Length; offset += chunkSize)
{
int size = Math.Min(chunkSize, text.Length - offset);
yield return text.Substring(offset, size);
}
}
static IEnumerable<string> Split(string str, int chunkSize)
{
int len = str.Length;
return Enumerable.Range(0, len / chunkSize).Select(i => str.Substring(i * chunkSize, chunkSize));
}
Я осмелюсь предоставить более LINQified версию решения Джона, основываясь на том факте, что тип string
реализует IEnumerable
:
private IList<string> SplitIntoChunks(string text, int chunkSize)
{
var chunks = new List<string>();
int offset = 0;
while(offset < text.Length) {
chunks.Add(new string(text.Skip(offset).Take(chunkSize).ToArray()));
offset += chunkSize;
}
return chunks;
}
Что-то вроде?
Calculate eachLength = StringLength / WantedCharLength
Then for (int i = 0; i < StringLength; i += eachLength)
SubString (i, eachLength);