2012-12-07 42 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

相關問題