2012-05-16 203 views
9

我正在为各种自动更新订阅的iOS应用程序实现应用程序内购买。当付款完成后,我们需要将交易信息发送到我们的服务器(云)以记录信息,以便我们可以在设定的时间间隔内验证收据,以确保订阅有效,而不是取消/退款或续订。我们将通过设定的时间间隔在服务器上设置JSON调用,通过应用内购买指南和我们共享的秘密来完成此操作,但尚未达到此目的,但在我们确实需要购买相关数据之前,即TransactionReceipt是一个NSData对象。将NSData转换为base64encoded并将字节数组转换为C#

我们希望将两个参数发送到我们的Web服务中的TransactionReceipt(以及其他项目,例如购买的ProductID等)。我们希望将这个值作为base64encoded值发送,这是我们认为需要在JSON请求中进行验证的值,因此我们将其存储在SQL Server中。

如果使用MonoTouch/C#,我们可以将NSData“TransactionReceipt”转换为base64encoded还是byte []?

谢谢。

回答

6

使用StreamBytesLength属性有两种简单的方法可以从NSData中获取数据。流版本会是什么样子:

public byte[] ToByte (NSData data) 
{ 
    MemoryStream ms = new MemoryStream(); 
    data.AsStream().CopyTo (ms); 
    return ms.ToArray(); 
} 

BytesLength版本是:

public byte[] ToByte (NSData data) 
{ 
    byte[] result = new byte[data.Length]; 
    Marshal.Copy (data.Bytes, result, 0, (int) data.Length); 
    return result; 
} 

获取的base64输出字符串保持相同:

public string ToBase64String (NSData data) 
{ 
    return Convert.ToBase64String (ToByte (data)); 
} 
+0

当我尝试使用ToByte方法时,出现了这个错误: //消息:不支持NSMutableData的包装,请调用new UnmanagedMemoryStream((Byte *)mutableData.Bytes,mutableData.Length) //例外:Wrapper对于NSMutableData不支持,请在/ Developer/MonoTouch/Source/monotouch/src中调用新的UnmanagedMemoryStream((Byte *)mutableData.Bytes,mutableData.Length),而不是:::在MonoTouch.Foundation.NSData.AsStream()[0x0002f] /shared/Foundation/NSData.cs:14 – Neal

+0

不是每个'NSData'都是可变的,'AsStream'会检查这个,请参阅:https://github.com/mono/maccore/blob/master/src/Foundation/NSData .cs#L136您可以尝试建议的代码(即'UnmanagedMemoryStream')或我提供的第二版ToByte(使用'Marshal'并复制数据)。 – poupou

0

这工作太:

string yourDataInBase64 = Convert.ToBase64String(yourData.ToArray());