草庐IT

Golang 而不是工作函数 bytes.Contains()

coder 2024-07-11 原文

我对函数 bytes.Contains(b, subslice []byte) bool 有奇怪的问题。它没有在函数 (c *IPConn) Read(b []byte) (int, error) 中接收到的字节数组中找到字符。应用程序是一个简单的服务器。 所以我有字节数组,它是通过服务器接收到变量 buf

buf := make([]byte, 1024)
Len, err := c.conn.Read(buf)
// below received content in buf
//{"abc":[{"b":5,"bca":14,"xyz":0}]}{"abc":[{"b":7,"hjk":14,"qwe":0}]}

现在我想使用下面的函数在数组 buf

中查找 }{ 个字符
if bytes.Contains(buf, []byte(`}{`) != false {
    fmt.Printf("I got you")
}

但是函数总是返回false。为什么?

我在程序中做了如下实验:

worker := []byte('{"abc":[{"b":5,"bca":14,"xyz":0}]}{"abc":[{"b":7,"hjk":14,"qwe":0}]}')

// try find }{

if bytes.Contains(worker, []byte(`}{`) != false {
    fmt.Printf("I got you")
}

是正确的!!!我不明白这一点...因为它允许通过服务器接收的数据之间的内容必须不同,并且数据形式通常是程序中的附件。

最佳答案

c.conn.Read(buf) 完成后,你真的检查了 errLen 吗?

你的程序(如上所示)的主要缺陷是你正在使用 buf 搜索数据,而套接字上的读取操作在接收到介于两者之间的任意数量的字节后可以自由地成功返回1 到 1024,接收到 0 到 1024 之间的任意字节数后返回错误。

所以,您必须做两件事:

  • Check for error ;
  • 要在读取操作结束后访问缓冲区开头的实际可用数据,您必须使用数据的实际长度,Len

要执行后者,您通常会构造一个新 slice :

data := buf[:Len]

然后使用data变量:

if bytes.Contains(data, []byte("}{")) {
   ...
}

如果不这样做,您可能会很容易地访问缓冲区中的陈旧数据 — 即,上次调用 c.conn.Read(buf) 时留下的数据。

如果您再多考虑一下这种情况,您会发现没有任何东西可以保证下一次对套接字上的 Read() 的调用会带来 }{ 序列放入缓冲区,您必须准备好积累您的数据:也就是说,

  1. Read() 的每次调用都应将其 Len 字节添加到缓冲区中的字节数,以供您的代码考虑。

    这意味着如果第 N 次读取操作未能提供您要查找的数据,则第 (N+1) 次操作必须将其字节放在前一次读取操作的最后一个字节之后;在 Go 中,这通常意味着为下一个读取操作构建另一个 slice 。

  2. 您应该使用当前累计字节总数来搜索“}{”。

请考虑从 this book 开始掌握网络编程的基础知识(具有 Go 特性)。


如您所见,正确处理此任务看起来很复杂。 那么为什么不让 Go 自己缓冲呢?

您可以这样重述您的算法:

  1. 读取输入数据,直到找到 } 字符。积累这些数据。

  2. 找到 后,读取下一个字符,如果它是 {,我们就找到了我们感兴趣的位置。

    否则返回步骤(1)。

这可以使用 bytes.Buffer 及其方法实现:

  • ReadBytes(delim byte) — 用于读取一个 字节。
  • ReadByte() — 用于读取单个字节以检查后面是否有 {
  • UnreadByte(c byte) — 如果字节不是 } 之后的 {,则将字节放回缓冲区。

现在让我们从更一般的角度来看您的问题。 您在示例中提供的数据对我来说就像一系列 JSON 对象。那么,为什么您要尝试应用一些低技术含量的方法来查找这些对象之间的边界,而不是仅仅使用 JSON decoder立即解码您的数据或至少正确跳过流中的对象?

关于Golang 而不是工作函数 bytes.Contains(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32715166/

有关Golang 而不是工作函数 bytes.Contains()的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  4. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  5. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  6. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  7. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  8. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  9. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  10. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

    使用Ruby1.9.2运行IDE提示说需要gemruby​​-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall

随机推荐