【问题标题】:Protocol Buffer: From Java to Objective-C using byte[]协议缓冲区:使用 byte[] 从 Java 到 Objective-C
【发布时间】:2012-08-09 04:50:03
【问题描述】:

我目前正在使用 google 的协议缓冲区。它可以在 Java 和 C# 之间轻松运行,但是我在尝试使用 Obj-c 实现相同用途时遇到了问题。

Java WS 返回一个字节[]。使用protocol buffer 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。也许每个字节都被转换为一个字符?不,这不匹配。

任何帮助将不胜感激。

丹麦人

【问题讨论】:

  • 神秘的 NSString 编码的源值是什么? (例如你在 Java 或 C# 中得到的字节数组)?
  • 你正在使用协议缓冲区的哪个 Objective-C 端口?

标签: java objective-c encoding protocol-buffers


【解决方案1】:

我对 Objective C 知之甚少,但 NSString 不是字节数组。您是否尝试过使用 -[NSString UTF8String] 将 NSString 转换为 char*?

【讨论】:

    【解决方案2】:

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

    我想知道 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 说这是最安全的方法:

    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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      相关资源
      最近更新 更多