使用MyString.Remove(x,y)从c#中的字符串中删除多个字符

使用MyString.Remove(x,y)从c#中的字符串中删除多个字符,c#,.net,string,teltonika,C#,.net,String,Teltonika,在我的服务器上运行程序(信标检测代码)时,我将收到一个大小可变的字符串,名为io385 字符串长度可以根据检测到的信标数量而变化: 一个信标:46个字节(前4个字节无用,后40个字节重要,后2个字节无用) 两个信标:90字节(前2个字节无用,后40个重要,后2个无用) 三个信标:134字节(前2个字节无用,后40个重要,后2个无用 因此,我的想法是删除无用的内容。尽管字符串大小可能不同,但我始终希望删除固定位置上的字节(对于第一个信标,前四个和后两个;对于下一个信标,前两个和后两个) 我开

在我的服务器上运行程序(信标检测代码)时,我将收到一个大小可变的字符串,名为io385

字符串长度可以根据检测到的信标数量而变化:

  • 一个信标:46个字节(前4个字节无用,后40个字节重要,后2个字节无用)
  • 两个信标:90字节(前2个字节无用,后40个重要,后2个无用)
  • 三个信标:134字节(前2个字节无用,后40个重要,后2个无用

因此,我的想法是删除无用的内容。尽管字符串大小可能不同,但我始终希望删除固定位置上的字节(对于第一个信标,前四个和后两个;对于下一个信标,前两个和后两个)

我开始手动删除2信标字符串上的无用字节。但是,我想对此进行优化,以便自动工作,无论字符串是46字节还是xxxx字节(否则,我必须手动为每个可能的字符串长度编写字符删除过程代码)


一种方法是首先删除前两个字符,使字符串中的所有“信标”长度相同(44个字符)。现在,我们可以创建一个循环,从
0
length/44
,其中跳过
迭代*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();
}
publicstaticstringremoveeuselesscharacters(字符串输入)
{
//首先添加参数验证
if(string.IsNullOrWhiteSpace(input)| | input.Length<46)返回输入;
//只需立即删除前两个字符
输入=输入。子字符串(2);
//这将保持结果
var result=新的StringBuilder();
//每个信标循环一次
对于(int i=0;i
如果您想修改代码以返回一个
列表
,其中每个字符串都是一个单独的信标,那么很容易做到:

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;
}
公共静态列表GetBeacons(字符串输入)
{
if(string.IsNullOrWhiteSpace(input)| | input.Length<46)
返回新列表{input};
输入=输入。子字符串(2);
var result=新列表();
对于(int i=0;i
给定

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);
}
输出

46
1234567890123456789012345678901234567890

176
1234567890123456789012345678901234567890
1234567890123456789012345678901234567890
1234567890123456789012345678901234567890
1234567890123456789012345678901234567890

你说你想删除“字节”,但你真的是指字符吗?不同的字符集每个字符的字节数不同。这个问题实际上与
teltonika
有关吗?听起来好像只是关于从字符串中删除字符。迭代器方法,如果(长度=46)循环i+=44子字符串的子字符串elseyield@RufusL我的错,是的,我指的是字符,不是字节。此外,是的,所有设备都是由teltonika制造的,添加了标签,因为它可能对其他人有用!@MichaelRandall我是C#新手(仅用C/C++编码)但我理解你的想法!我会尝试基于此创建一个解决方案,并在完成后尽快编辑帖子!@PoulBak迭代器非常好而且简洁!我想这正是@MichaelRandall所说的!就像我之前所说的,我是C新手,但我理解代码背后的主要思想!@Jonaas18我是Michael Randall:)哦,抱歉啊哈:P为了正确理解代码,我正在从头开始创建代码,并在浏览每一行时进行注释!非常感谢你的帮助!
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