如何从Ruby中的TCPSocket获取原始(未解码)字节数组
我一直在使用ruby设置带有服务器的TCPSocket,但遇到了一个障碍。当从套接字接收数据时(使用如何从Ruby中的TCPSocket获取原始(未解码)字节数组,tcp,ruby,Tcp,Ruby,我一直在使用ruby设置带有服务器的TCPSocket,但遇到了一个障碍。当从套接字接收数据时(使用socket.get或socket.recv),我得到如下结果: x00\x03!\xB2\x00\x00*\xCF "x00\x03!\xB2\x00\x00*\xCF".unpack("H*") => ["7830300321b200002acf"] 我在Wireshark中捕获数据包时得到的是 x00\x03\x21\xB2\x00\x00\x2a\xCF 如您所见,\x21被解
socket.get
或socket.recv
),我得到如下结果:
x00\x03!\xB2\x00\x00*\xCF
"x00\x03!\xB2\x00\x00*\xCF".unpack("H*")
=> ["7830300321b200002acf"]
我在Wireshark中捕获数据包时得到的是
x00\x03\x21\xB2\x00\x00\x2a\xCF
如您所见,\x21
被解码为ASCII等效的代码>和\x2a
被解码为ASCII等效的*
我已经检查和谷歌搜索了很多次,但还没有找到一个解决方案来获取原始的、未解码的信息。我构建了一个解析器,它将从流中搜索相关数据并获取我需要的内容,但我不想在解码之前浪费时间对其重新编码。或者,我将ASCII合并到解析器中,但这将是一个巨大的痛苦。这个流中有很多字节,对它们进行重新编码将非常耗时。我还看到netcat
从TCP流返回与ruby相同的输出。我也不知道如何让netcat
输出未解码的字节数组
代码:
require 'socket'
s = TCPSocket.new "10.0.0.3", 27000
while true do
item = s.recv(5000)
puts item
puts item.inspect
end
这是我第一次尝试socket编程,如果我错过了一些非常明显的东西,我很抱歉。我是在头脑中发明了这个问题,我很笨
要解决此问题,您只需获取TCP信息字符串,并按如下方式调用unpack(“H*”)
:
x00\x03!\xB2\x00\x00*\xCF
"x00\x03!\xB2\x00\x00*\xCF".unpack("H*")
=> ["7830300321b200002acf"]
这与x00\x03\x21\xB2\x00\x00\x2a\xCF
现在,我只需要调整解析器来拆分它或处理大量字节数组
是的,我是个十足的傻瓜。我将信息存储为s.recv(5000)。检查而不是s.recv(5000)
,因此ruby对字节数组分隔符进行了转义,因此.pack
无法处理它。当我定期保存信息时,(未替换),.pack
工作得很好!