2012-08-12 116 views
0

我目前使用google的协议缓冲区。它在Java和C#之间毫无痛苦地工作,但是我遇到了试图用Obj-c实现相同用法的问题。协议缓冲区:从Java到Objective-C使用byte []

Java WS返回一个字节[]。使用该协议缓冲API的代码是很简单的:

productGroup.toByteArray(); 

我能够重建具有碟的C#端口的对象,使用:

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

然而,在OBJ-C侧,我我正在努力工作以回报价值。

NSString的我来自同一个Web服务的RPC接受的是:

CmYKEzgwMDAwMUFELTEzMjUyNzk5MTQySUZPT0QgJiBCRV... 

我不太清楚和这事,因为我不知道它是什么,它保存生成来自一组字节。我试着用

NSData* data = [returnValue dataUsingEncoding:NSUTF8StringEncoding]; 

[ProductProtoGroup parseFromData:data];直接解析它NSData的,我得到一个InvalidProtocolBuffer

我检查在Java端原byte[]什么字节字符串/十六进制表示,并没有关系” t匹配我从ws收到的字符串。

十六进制是0-F。也许每个字节都转换为char?不,那不匹配。

任何帮助,将不胜感激。

戴恩

+0

的来源是什么值谜的NSString是编码? (例如,您在Java或C#中获得的字节数组)? – 2012-08-12 22:01:23

+0

您使用的协议缓冲区的Objective-C端口是什么? – djf 2012-08-12 22:29:49

回答

0

我不是很了解目标C,但一个NSString没有字节数组。您是否尝试过使用-[NSString UTF8String]将NSString转换为char *?

1

随着新鲜的头脑和一些有用的评论,我终于明白了。

我想知道Web服务如何在Java中自动发送一个byte [],然后在C#中重建它,以及稍后如何存储此消息。

原来的字符串,

CmYKEzgwMDAwMUFELTEzMjUyNzk5MTQySUZPT0QgJiBCRV...

确实是什么在SOAP信封被发送。因此,在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 !,我承认这是第一次见面。闲逛,斯基特说,这是最安全的办法:

How can I safely convert a byte array into a string and back?

所以,知道了编码,溶液变成直线前进。使用在回答中提出这个问题的算法:How do I do base64 encoding on iphone-sdk?,我的最终代码变成:

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