【问题标题】:Ruby network byte order to native endianness from array of byte values从字节值数组到本地字节序的 Ruby 网络字节顺序
【发布时间】:2011-07-20 16:49:10
【问题描述】:

假设我有一个像 arr = [24, 21, 25, 40, 236, 89] 这样的数组,它表示一个 IP 地址(前四个字节)和一个端口号(后两个字节),就像在二进制对等部分 http://wiki.theory.org/BitTorrentSpecification#Tracker_Response 中一样。

我的问题是:如何从中获取 IP 地址和端口号?

IP 的arr[0..3].reverse.join '.' 和端口的arr[5] << 8 | arr[4] 似乎不正确。

我在这里假设,因为我使用string_from_tracker.unpack 'C*' 来获得arr,所以这些位已经处于本机字节序...

我不确定这应该如何工作。

谢谢。

【问题讨论】:

    标签: ruby networking ip endianness unpack


    【解决方案1】:

    什么是“不正确的部分”? IE。预期的结果是什么?

    至少在这里你有一个错误。组合最后两个数字应该像这样:

    (arr[5] << 8) + arr[4]
    

    这给出了23020。看起来更像是一个 Bittorrent 端口号。

    编辑:呵呵 :) 其实这相当于上面的:

    (arr[5] << 8) | arr[4]
    

    【讨论】:

    • 这实际上做同样的事情(位移创建零,添加到它们和或'ing是相同的)。预期的结果是我可以成功 ping 的东西......所以我真的假设我错了,因为我用这种方法获得的 IP 似乎都不正确。
    • techotopia.com/index.php/…
    • 是的..对。唔。但是对 IP 无能为力:-/ 如果我们知道它应该是什么,然后从那里开始工作会更容易。
    • 顺便说一句。为什么你认为你应该能够ping通?并非所有计算机都会响应 ping,但也许您考虑到了这一点..
    • 问题是我正在使用一个随机的 archlinux .torrent 文件测试我的代码,并且我得到了一个同行列表。当然,有些计算机会阻止 ping,但肯定不是全部!我想我可以得到一个bittorrent客户端并找到IP,但很难知道它是否与我试图解码的IP相同。 unpack 'C*' 部分是否保证它以本机字节序返回字节?
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2015-03-30
    • 2021-04-26
    相关资源
    最近更新 更多