2014-10-10 76 views
0

Perl的“包”功能在Perl的,我有下面的代码行:等效于Java的

pack("C (N)$cnt", $cnt , @items); 

我有问题,调换此为Java。我该怎么做?

+1

我不知道任何的Perl。如果我知道该代码在做什么,我可能会提供帮助。 – csmckelvey 2014-10-10 21:28:21

+0

我检查了DatatypeConverter的API,但我没有看到如何以“网络”(big-endian)顺序将我的列表打包成无符号长整型(32位)。 – syker 2014-10-10 21:31:16

+0

@skyer你可以使用java的nio输出使用ByteBuffer.allocate(size).order(endianness).asIntBuffer()来设置一个IntBuffer,并且以你需要的方式创建一个EndBuffer – 2014-10-10 22:20:38

回答

0

我的Perl是很生疏,但看着man perlfunc后,我觉得这可能是你想要什么:

List<Integer> items = ...; 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
DataOutputStream stream = new DataOutputStream(baos); 
stream.write(items.size()); 
for (Integer item : items) { 
    stream.writeInt(item); 
} 
stream.flush(); // not sure this is strictly necessary 
byte[] result = baos.toByteArray(); 
+0

1)我很好奇为什么stream.writeInt )工作,而不是stream.wrtiteLong()。那是因为Java Int被解释为无符号long?如果是这样,Java Long解释为什么? 2)baos.toString()是我需要的,谢谢。 – syker 2014-10-10 22:07:35

+0

Java中的long是64位,int是32位。签名与无签名无关紧要,因为它不会改变表示形式。 'baos.toString()'使用默认的平台编码。你可能想明确指定一个编码,例如'baos.toString(“UTF-8”)'。 – 2014-10-10 22:11:58

+0

stream.write()写入1个字节还是4个字节?根据Javadoc [1],它看起来是1个字节。 [1] http://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html#write(int) – syker 2014-10-15 19:15:49