簡體   English   中英

協議緩沖區:使用字節[]從Java到Objective-C

[英]Protocol Buffer: From Java to Objective-C using byte[]

我目前正在使用Google的協議緩沖區。 它可以在Java和C#之間輕松地工作,但是我在嘗試實現與Obj-c的相同使用時遇到了問題。

Java WS返回一個byte []。 使用協議緩沖區API的代碼非常簡單:

productGroup.toByteArray();

我可以使用Skeet的C#端口重新創建對象,方法是:

byte[] result = searchWebService.SearchProductsProtocolBuffer(search);
ProductProtoGroup products = ProductProtoGroup.ParseFrom(result);

但是,在obj-c方面,我正在努力使用返回值。

我從同一Web服務RPC收到的NSString是這樣的:

CmYKEzgwMDAwMUFELTEzMjUyNzk5MTQySUZPT0QgJiBCRV...

我不太確定該怎么做,因為我不知道它是什么,除非它是由字節數組生成的。 我嘗試使用將其直接解析為NSData

NSData* data = [returnValue dataUsingEncoding:NSUTF8StringEncoding];

但在[ProductProtoGroup parseFromData:data]; ,我得到一個InvalidProtocolBuffer

我已經在Java端檢查了原始byte[]字節字符串/十六進制表示形式,它與我從ws接收的字符串不匹配。

十六進制為0-F。 也許每個字節都轉換為char? 不,那不匹配。

任何幫助,將不勝感激。

丹恩

有了新的想法和一些有用的評論,我終於明白了。

我想知道Web服務如何自動用Java發送一個byte [],然后在C#中重新構造它,以及以后如何存儲此消息。

找出字符串,

CmYKEzgwMDAwMUFELTEzMjUyNzk5MTQySUZPT0QgJiBCRV...

確實是肥皂信封中寄出的東西。 因此,在Java中創建byte []與傳輸之間,發生了一些事情。 查看C#中的消息處理程序,

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("", 
    RequestNamespace="x", ResponseNamespace="x", 
    Use=System.Web.Services.Description.SoapBindingUse.Literal, 
   ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[return: System.Xml.Serialization.XmlElementAttribute("return",
   Form=System.Xml.Schema.XmlSchemaForm.Unqualified, 
   DataType="base64Binary", IsNullable=true)]
public byte[] searchProductProtocolBuffer([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] string arg0)
{
   object[] results = this.Invoke("searchProductProtocolBuffer", new object[] {
                    arg0});
   return ((byte[])(results[0]));
}

所以base64Binary !,我承認是第一次見面。 Skeet隨便看看,這是最安全的方法:

如何安全地將字節數組轉換為字符串並返回?

因此,知道了編碼之后,解決方案就變得簡單了。 使用針對此問題的答案中提出的算法: 如何在iphone-sdk上進行base64編碼? ,我的最終代碼變為:

NSString* returnValue = [WebServiceUtil processStringReturnValue:value];
NSData* data = [Encoding base64DataFromString:returnValue];
ProductProtoGroup* products = [ProductProtoGroup parseFromData:data];

我對目標C知之甚少,但是NSString沒有字節數組。 您是否嘗試過使用-[NSString UTF8String]將NSString轉換為char *?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM