【问题标题】:Create bytebuffer like object in Ruby在 Ruby 中创建类似对象的字节缓冲区
【发布时间】:2011-08-23 08:24:10
【问题描述】:

我需要在 Ruby 中创建一个类似 Bytebuffer 的对象。这是我在 JAVA 中的示例

int ADD_BYTES_FOR_MSG_LENGTH = 4;

Integer messageBodySize = new Integer(messageBody.getBytes().length);
byte[] messageHeader = ByteBuffer.allocate(ADD_BYTES_FOR_MSG_LENGTH).putInt(messageBodySize).array();

messageToSend = new byte[messageHeader.length + messageBodySize];

System.arraycopy(messageHeader, 0, messageToSend, 0, messageHeader.length);
System.arraycopy(messageBody.getBytes(), 0, messageToSend, messageHeader.length, messageBodySize);

我创建了一条以 4 个字节开头的消息,其中包含消息正文部分的大小,然后是实际消息。我不知道如何在 Ruby 中做到这一点,所以请帮忙。

【问题讨论】:

    标签: java ruby bytebuffer


    【解决方案1】:

    我使用StringIO 的扩展版本为Steam Condenser 执行此操作。

    虽然我没有使用任何 put* 方法,但这些方法可以很容易地实现,例如:

    class StringIO
    
      def put_int(i)
        write [i].pack('v')
      end
    
    end
    

    您可以查看codedocumentation of the original classmy extensions

    【讨论】:

    • 我猜你应该在那里使用write而不是puts
    • 感谢您的帮助,但现在我又被卡住了...当我执行write [i].pack('L')(无符号 32 位整数)时,StringIO 对象正在分配 5 个字节(方法大小返回 5)。我只需要在 4 个字节上写这个 int(就像在我的 java 示例中一样)。你能给我一个提示如何处理吗?
    • @Neuro:你用的是write还是putsputs 将附加一个换行符并给你一个额外的字节,write 不会。还有syswrite 可能更符合您想要的语义。
    • 是的!愚蠢的我。经典的复制粘贴错误。但不幸的是,有些东西不起作用:/我在StringIO对象上执行put_int(size_of_msg)然后write(msg),我通过套接字发送它,但在java端应用程序中我没有收到预期的消息:/
    • 我明白了!我通过write [i].pack('N') 以网络字节顺序解包:) 我通过stringioobj.string 方法写入套接字。非常感谢大家的帮助,这个问题让我痛苦了将近一个星期:)
    猜你喜欢
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多