Строка разделения в 512 символьных блоках

Можно использовать 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
10
задан Abel 23 May 2014 в 19:58
поделиться

6 ответов

Примерно так:

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, которые, в свою очередь, могут отличаться от разделения на блоки глифов.

20
ответ дан 3 December 2019 в 15:35
поделиться

Хотя на этот вопрос пока есть принятый ответ, вот краткая версия с помощью регулярных выражений. Пуристам это может не понравиться (по понятным причинам), но когда вам нужно быстрое решение и вы умеете работать с регулярными выражениями, это может быть оно. Производительность на удивление неплохая:

string [] split = Regex.Split(yourString, @"(?<=\G.{512})");

Что он делает? Отрицательный взгляд назад и запоминание последней позиции с помощью \ G . Он также поймает последний бит, даже если он не делится на 512.

3
ответ дан 3 December 2019 в 15:35
поделиться

с использованием реализации Джона и ключевого слова 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);
    }
}
3
ответ дан 3 December 2019 в 15:35
поделиться
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));    
}

источник: Разделение строки на куски определенного размера

1
ответ дан 3 December 2019 в 15:35
поделиться

Я осмелюсь предоставить более 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;
}
1
ответ дан 3 December 2019 в 15:35
поделиться

Что-то вроде?

Calculate eachLength = StringLength / WantedCharLength
Then for (int i = 0; i < StringLength; i += eachLength)
SubString (i, eachLength);
-1
ответ дан 3 December 2019 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: