2011-08-23 21 views
1

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

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中做到这一点,所以请帮助。

回答

3

我这样做了Steam Condenser使用扩展版本StringIO

虽然我不使用任何put*方法,这些可以很容易地像实施,例如:

class StringIO 

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

end 

你可能有一个看codedocumentation of the original classmy extensions

+0

我想你应该用'write'代替'puts'呢? –

+0

感谢您的帮助,但现在我再次被卡住了......当我写'[.pack]'('L')'(无符号32位整数)时,StringIO对象分配了5个字节(方法大小返回5 )。我只需要在4个字节上写这个int(就像在我的java例子中)。你能给我一个提示如何处理它吗? – Neuro

+0

@Neuro:你使用'write'还是'puts'? 'puts'会附加一个换行符并给你一个额外的字节,'write'不会。还有'syswrite'可以更好地匹配你想要的语义。 –