如何解决使用MyString.Removex,y从c#中的字符串中删除多个字符
在服务器上运行程序时(一个 beacon 检测代码),我将收到一个名为 io385 的可变大小的字符串。 / p>
字符串长度会根据检测到的 beacon 的数量而有所不同:
- 一个信标:46个字节(前4个字节无效,接下来的40个重要,后2个无效);
- 两个信标:90个字节(前2个字节无效,接下来的40个重要,后2个无效);
- 三个信标:134个字节(前2个字节无用,接下来的40个重要,后2个无用;
...
因此,我的想法是删除所有无用的东西。即使字符串的大小可以变化,我也总是要删除固定位置的字节(对于第一个信标, first 四个, last 2;对于下一个信标, em> first 两个和 last 两个)。
我开始手动删除2个 beacon 字符串上无用的字节。但是,我想对此进行优化,以便自动处理字符串是46字节还是xxxx字节(否则,我将不得不为每个可能的字符串长度手动编码字符删除过程)。
string io385 = "11210000AAAA0000AAAA0000AAAA0000AAAA0A0A0A0ABF210000BBBB0000BBBB0000BBBB0000BBBB0B0B0B0BBF";
string informacao = String.copy(io385);
informacao = informacao.Remove(0,4).Remove(40,2).Remove(40,2).Remove(80,2);
int x = io385.Length;
int y = informacao.Length;
Console.WriteLine("Original String: {0}",io385);
Console.WriteLine("copied String: {0}",informacao);
Console.WriteLine("Original String length: {0}",x);
Console.WriteLine("copied String length: {0}",y);
解决方法
给予
public static IEnumerable<string> GetStuff(string input)
{
Console.WriteLine(input.Length);
if (input.Length == 46)
yield return input.Substring(4,40);
else
for (var i = 0; i < input.Length; i += 44)
yield return input.Substring(i + 2,40);
}
用法
var input = "xxxx1234567890123456789012345678901234567890xx";
var input2 = "xx1234567890123456789012345678901234567890xxxx1234567890123456789012345678901234567890xxxx1234567890123456789012345678901234567890xxxx1234567890123456789012345678901234567890xx";
Console.WriteLine(string.Join("\r\n",GetStuff(input)));
Console.WriteLine();
Console.WriteLine(string.Join("\r\n",GetStuff(input2)));
输出
46
1234567890123456789012345678901234567890
176
1234567890123456789012345678901234567890
1234567890123456789012345678901234567890
1234567890123456789012345678901234567890
1234567890123456789012345678901234567890
,
执行此操作的一种方法是先删除前两个字符,以使字符串中的所有“信标”具有相同的长度(44个字符)。现在我们可以创建一个循环,从0
到length / 44
,然后跳过iteration * 44
个字符(即跳过以前的信标),然后再跳过2
个字符(即此信标的前2个),然后输入40
个字符(我们关心的字符数)。
在一种方法中,它可能看起来像这样:
public static string RemoveUselessCharacters(string input)
{
// Add argument validation first
if (string.IsNullOrWhiteSpace(input) || input.Length < 46) return input;
// Just remove the first two characters right away
input = input.Substring(2);
// This will hold the result
var result = new StringBuilder();
// Loop once for every beacon
for (int i = 0; i < input.Length / 44; i++)
{
// Skip previous beacons plus two characters,then take 40 characters
result.Append(string.Concat(input.Skip(i * 44 + 2).Take(40)));
}
// Return just the beacon charcters for all the beacons
return result.ToString();
}
如果您想修改代码以返回List<string>
(每个字符串是一个单独的信标),则很容易做到:
public static List<string> GetBeacons(string input)
{
if (string.IsNullOrWhiteSpace(input) || input.Length < 46)
return new List<string> {input};
input = input.Substring(2);
var result = new List<string>();
for (int i = 0; i < input.Length / 44; i++)
{
result.Add(string.Concat(input.Skip(i * 44 + 2).Take(40)));
}
return result;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。