gpt4 book ai didi

.net - 搜索字节[]

转载 作者:行者123 更新时间:2023-12-02 09:49:06 26 4
gpt4 key购买 nike

.NET 非常支持在字符串中搜索字符串,但是当您需要搜索的数据不是字符串时该怎么办?

我有通过 NetworkStream 以常规 block 形式到达的二进制数据。数据包是二进制的,但它们都以签名字节序​​列开头。我将这些 block 累积到一个更大的缓冲区中,并查找数据包开头签名。

我真正要寻找的是相当于 String.IndexOf(ss) 方法的 byte[] 。我有一种不好的感觉,我必须自己用循环和状态机来实现这个。

有什么建议吗?交给你了!

<小时/>

正如所建议的,Array.IndexOf(byte) 至少会为我节省一个显式循环。自从发布以来,我突然想到找到第一个签名字节,然后向前探测最后一个签名字节应该在哪里的匹配,然后如果它们都匹配,则尝试对字符串的其余部分进行强力比较。这种方法的优点是可以廉价地拒绝错误匹配,并且当我有部分签名等待另一个 block 时,我可以廉价地拒绝。

谷歌透露,上述绝妙计划是“KMP”或 Knuth-Morris-Pratt 算法的退化案例。好的一面是,如果高德纳 (Knuth) 把自己的名字写在上面,那可能是涂了油的闪电,但坏处是,为什么每当我有一个好主意时,唐纳德·高德纳 (Donald Knuth) 就会在 25 年前想到它?

由于我无法将积分授予 Donald Knuth,所以我猜他们会授予 Nelson。

最佳答案

您可以使用 Array.IndexOf 来查找单个字节。

但是,我要提醒您,一些有效数据可能会意外成为您的签名,从而完全导致您的申请失败。我认为更好的解决方案是始终发送包含数据包大小的四字节整数。然后读取那么多字节以清除该数据包的缓冲区。

如果您使用 TCP,如果客户端在数据包大小上撒谎或请求了愚蠢的内存量,那么踢掉客户端是完全可以接受的:)

关于.net - 搜索字节[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/190265/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com