ruby条件返回nil而不是true/false

ruby条件返回nil而不是true/false,ruby,encoding,byte,Ruby,Encoding,Byte,我使用的是ruby 2.0.0p451(2014-02-24)[x64-mingw32],我遇到了以前在1.9.x版本中工作的东西,但在这里不起作用。我想知道他们是否改变了行为,或者我是否做错了什么,或者这是一个bug 我将一个字节发送到套接字\xFF,并在另一端接收它,但当我尝试将其与自身进行比较时(应返回true),它不会返回预期的输出 例如,我发送字符串\xFF\x50\x00username\x00555\x00,在另一端接收到它,但当我尝试将第一个字节与它自身进行比较时,条件行为错误

我使用的是ruby 2.0.0p451(2014-02-24)[x64-mingw32],我遇到了以前在1.9.x版本中工作的东西,但在这里不起作用。我想知道他们是否改变了行为,或者我是否做错了什么,或者这是一个bug

我将一个字节发送到套接字
\xFF
,并在另一端接收它,但当我尝试将其与自身进行比较时(应返回true),它不会返回预期的输出

例如,我发送字符串
\xFF\x50\x00username\x00555\x00
,在另一端接收到它,但当我尝试将第一个字节与它自身进行比较时,条件行为错误

下面是一些代码示例,您可以看到我是如何处理数据的(浏览相关代码)

在1.9.X中,除非语句运行良好,否则此
。调试数据时,从
@receiver.getbyte
返回的数据确实是“\xFF”,但由于某种原因,
eql?
比较返回false而不是true,导致函数返回false。如果我从消息中删除这个字节并删除check,那么调用
getbyte
方法的代码的其余部分也可以正常工作

另外,如果我将字节改为“\x55”而不是“\xFF”,则条件
,除非
语句正常工作


我不知道发生了什么事。\xFF是为某事保留的吗?

我猜
缓冲区是二进制编码的(即
缓冲区。编码
是ASCII-8BIT)。这意味着这种情况正在发生:

c  = @receiver.getbyte # c also has binary encoding
ff = "\xff"            # ff is probably UTF-8
c.eql? ff              # comparing strings in different encodings gives you `false`
相反,您应该进行简单的数字比较:

@receiver.getbyte.getbyte(0) == 255
或者更好的是,修改
getbyte
以返回整数

我认为你的1.9.X版本主要是出于偶然,你应该一直使用一个简单的数字比较

请记住,缓冲区中的字节(例如0xFF和0x00)在UTF-8字符串中无效,因此应将缓冲区保留为二进制。对于UTF-8字符串的部分,可以在缓冲区的片上使用
force_编码。你可能也想看看



请注意,我正在链接到Ruby 2.0.0特定文档,以匹配您当前使用的Ruby版本。

谢谢,这很有意义,因为我也认为这是问题所在。我想我必须重新考虑如何为我的服务器实现二进制字节数据包协议。编辑:注意,我没有引用getbyte函数,而是引用PacketReceiver getbyte方法(我忘了包含@receiver的声明)。虽然我仍然相信这是一个编码问题,正如你提到的。我认为默认情况下套接字是二进制的,但我可能错了。如果不是这样,那么这样做应该很容易。然后将字节作为数字进行比较,并在将缓冲区中的块分割为字符串时调整编码。那么
@receiver.getbyte
是返回单个字符串的
PacketReceiver#getbyte
?等一下,我来收拾一下。是的,没错,很抱歉发生了这件事。我忘了声明@receiver实际上是什么。请检查我的更新。有趣的是,我有“使用简单的数字比较也巧妙地绕过了任何奇怪和有趣的编码问题,您可能会遇到意外比较单字符二进制字符串(您的
@receiver
应该是二进制编码的,顺便说一句,它包含在UTF-8中无效的内容)和单字符UTF-8字符串(例如
“\xFF”
)”在我的原始答案中。
@buffer
在@muistooshort中是什么编码?正如您所认为的
@buffer
buffer
都是ASCII-8BIT编码。我如何将其更改为UTF-8?我取消删除了关于编码问题的答案。很抱歉造成混淆。@muistooshort没问题,谢谢您提供的信息。
@receiver.getbyte.getbyte(0) == 255