0

私は現在、グーグルのプロトコルバッファを使用しています。JavaとC#の間で問題なく動作しますが、Obj-cで同じ使用法を実現しようとすると問題が発生します。

JavaWSは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側で、元のバイト文字列/ 16進表現を確認しましたがbyte[]、wsから受け取った文字列と一致しません。

16進数は0-Fです。おそらく、各バイトは文字に変換されましたか?いいえ、一致しません。

どんな助けでもいただければ幸いです。

デーン

4

2 に答える 2

1

新鮮な心といくつかの役立つコメントで、私はついにそれを手に入れました.

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 do I do base64 encoding on iphone-sdk? 、私の最終的なコードは次のようになります。

NSString* returnValue = [WebServiceUtil processStringReturnValue:value];
NSData* data = [Encoding base64DataFromString:returnValue];
ProductProtoGroup* products = [ProductProtoGroup parseFromData:data];
于 2012-08-13T16:10:22.560 に答える
0

私は Objective C についてほとんど知りませんが、NSString はバイト配列ではありません。-[NSString UTF8String]を使用して NSString を char* に変換しようとしましたか?

于 2012-08-12T22:23:38.360 に答える