2012-12-07 41 views
3

因此,根据我对节俭的理解,Java是唯一支持的没有二进制安全字符串的语言,因此是节俭二进制类型。我的问题是它似乎没有工作。Java节俭客户端和二进制数据

我的定义文件是:

service myService { 
    int myMethod(1:binary input) 
} 

我的Java客户端从观察到具有正长度的二进制数据,在此之前调用myMethod的可打印字节构建字节缓冲区。

紧随C++实现myMethod的内部(从俭生成的服务器骨架),试图打印输入显示它一如既往为空尺寸的0.1

任何想法,我在这里失踪?更改二进制字符串使一切工作像一个魅力,减去事实,我不希望不安全的Java转换字符串以后处理...

+0

二进制类型是Thrift在某些语言之间的已知互操作性问题。但我没有听说过C++有问题。你有捕获的原始线数据吗? – 2012-12-07 20:23:54

回答

4

最有可能你有问题,因为Java中的ByteBuffer有可变州。因此,任何读取操作实际上都会修改ByteBuffer,因为它会修改读取位置。

的simpliest(而不是最有效的)的方式与节俭的二进制文件在Java中创建二进制文件的字节数组,并使用调用之前immidiately包裹他们的信息缓冲区,即工作:

byte[] input = ....; 
myService.myMethod(ByteBuffer.wrap(input)); 

另一种可能的解决方案是使用ByteBuffer.duplicate保持原始缓冲区安全,即:

ByteBuffer input = ....; 
dump(input.duplicate());// dump function may change buffer position 
myService.myMethod(input); 
+0

如果我正确理解你,如果我尝试从Java读取,那么你引用的问题会暴露自己。我现在正在做的就是匹配你的第一个代码片段,唯一的例外是我使用put代替wrap,并且在方法调用之外作为一个单独的行来执行。我以后不会执行任何ByteBuffer操作。 – yodafan86

+1

看起来像你钉住了问题。第三种方法,我最终使用的方法是在方法调用之前调用buffer.position(0)。 – yodafan86

相关问题