我有以下二进制字符串
string binaryString = "110011100110011011001110011001101100111001100110110011100110011011001110001001100110011011001110";
现在我想将上面的字符串拆分为8个字符的组。例如
11001110 11001110 11001110 11001110 11001110 11001110
我尝试了以下代码但未获得预期结果
var binary = binaryString.Where((x, y) => y % 8 == 0).ToList();
答案 0 :(得分:11)
试试这个:
IEnumerable<string> groups = Enumerable.Range(0, binaryString.Length / 8)
.Select(i => binaryString.Substring(i * 8, 8));
答案 1 :(得分:3)
怎么样?
string binaryString = "110011100110011011001110011001101100111001100110110011100110011011001110001001100110011011001110";
int step = binaryString.Length / 8;
for (int i = 0; i < step; i++)
{
Console.WriteLine(binaryString.Substring(i, 8));
}
输出将是;
11001110
10011100
00111001
01110011
11100110
11001100
10011001
00110011
01100110
11001101
10011011
00110110
这是DEMO。
答案 2 :(得分:1)
List<string> bytes = binaryString.Select((c, i) => new { c, i })
.GroupBy(x => x.i / 8)
.Select(x => String.Join("",x.Select(y => y.c)))
.ToList();
答案 3 :(得分:1)
在纯LINQ中,它是这样的:
var parts = Enumerable.Range(0, (binaryString.Length + 7) / 8)
.Select(p => binaryString.Substring(p * 8, Math.Min(8, binaryString.Length - (p * 8))))
.ToArray();
它非常复杂,因为它能够“解析”小于8个字符的范围。所以:
string binaryString = "123456781234567"
将返回12345678,1234567
(binaryString.Length + 7) / 8)
这是我们将拥有的零件数量。我们必须清楚地整理,所以“0”是一部分,“123456781”是两部分。通过添加(除数-1),我们正在四舍五入。
Enumerable.Range(0, (binaryString.Length + 7) / 8)
这将给出一系列数字0,1,2,#of parts - 1
.Select(p =>
选择: - )
binaryString.Substring(p * 8, Math.Min(8, binaryString.Length - (p * 8))))
子串
p * 8
起点,零件号* 8,(因此零件#0从0开始,零件#1从8开始......)
Math.Min(8, binaryString.Length - (p * 8)))
通常它会是8,但最后一部分可能会更短。这意味着Min
与剩余字符数之间的8
。
使用正则表达式可能更容易:
var parts2 = Regex.Matches(binaryString, ".{1,8}")
.OfType<Match>()
.Select(p => p.ToString())
.ToArray();
(捕获1-8个字符的组,任何字符,然后将匹配并放入数组中)