协议缓冲区:使用字节[j]从Java到ObjtovieC

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

我目前正在使用谷歌的协议缓冲区。它在JAVA和C语言之间工作无痛,但是我在尝试用Obj-C实现同样的问题时遇到了一些问题。

Java WS返回字节[]。使用协议缓冲区API的代码非常简单:

1
productGroup.toByteArray();

我可以用双向飞碟的C端口重新创建对象,使用:

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

然而,在obj-c方面,我正在努力处理回报值。

我从同一个Web服务RPC接收的nsstring如下:

1
CmYKEzgwMDAwMUFELTEzMjUyNzk5MTQySUZPT0QgJiBCRV...

我不太确定该怎么处理它,因为我不知道它是什么,请保存它是从一个字节数组生成的。我试图用

1
NSData* data = [returnValue dataUsingEncoding:NSUTF8StringEncoding];

但是在[ProductProtoGroup parseFromData:data];上,我得到了InvalidProtocolBuffer

我已经在Java方面检查了原始EDCOX1×2的字节串/十六进制表示,它与从WS接收的字符串不匹配。

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

任何帮助都将不胜感激。

丹麦人


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

我想知道Web服务是如何自动地在爪哇发送字节[],然后在C后面重建它的,以及以后如何存储这个消息。

把绳子弄出来,

CmYKEzgwMDAwMUFELTEzMjUyNzk5MTQySUZPT0QgJiBCRV...

确实是装在肥皂信封里的东西。因此,在Java中创建字节[]与传输之间,发生了一些事情。查看C_中的消息处理程序,

1
2
3
4
5
6
7
8
9
10
11
12
13
[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]));
}

所以base64二进制!这是我第一次见面。斯基特四处张望,说这是最安全的方法:

如何安全地将字节数组转换为字符串并返回?

因此,知道了编码,解决方案就变得直接了。使用这个问题的答案中给出的算法:如何在iPhoneSDK上进行base64编码?,我的最终代码变为:

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

我对目标C知之甚少,但nsstring不是字节数组。是否尝试使用-[nsstring utf8string]将nsstring转换为char*?