使用MyString.Removex,y从c#中的字符串中删除多个字符

如何解决使用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

Full Demo Here

,

执行此操作的一种方法是先删除前两个字符,以使字符串中的所有“信标”具有相同的长度(44个字符)。现在我们可以创建一个循环,从0length / 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?