将NSData转换为C#中的base64编码和字节数组

10
我正在为我们的iOS应用程序实现各种自动续订订阅的应用内购买。当付款完成后,我们需要将交易信息发送到我们的服务器(云)以记录信息,以便我们可以按照设置的时间间隔验证收据,以确保订阅有效,未取消/退款或续订。我们将按照应用内购买指南和我们的共享密钥从服务器上进行JSON调用,并在此之前尚未完成,但在此之前,我们需要获得与购买相关的数据,即TransactionReceipt,它是一个NSData对象。
我们想要向我们的Web服务发送两个参数,以获取TransactionReceipt(以及购买的ProductID等其他项目)。我们希望将此作为base64编码值发送,这是我们认为需要在JSON请求中发送以进行验证的内容,因此我们将其存储在SQL Server中。
如何使用MonoTouch / C#将NSData“TransactionReceipt”转换为base64编码和byte []?
谢谢。
2个回答

7

获取NSData数据有两种简单的方式,使用StreamBytesLength属性。流版本的代码如下:

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));
}

当我尝试使用ToByte方法时,出现了以下错误://Message: Wrapper for NSMutableData is not supported, call new UnmanagedMemoryStream ((Byte*) mutableData.Bytes, mutableData.Length) instead //Exception: Wrapper for NSMutableData is not supported, call new UnmanagedMemoryStream ((Byte*) mutableData.Bytes, mutableData.Length) instead::: at MonoTouch.Foundation.NSData.AsStream () [0x0002f] in /Developer/MonoTouch/Source/monotouch/src/shared/Foundation/NSData.cs:144 - Neal
并非每个 NSData 都是可变的,而 AsStream 会检查这一点,请参见:https://github.com/mono/maccore/blob/master/src/Foundation/NSData.cs#L136 您可以尝试建议的代码(即 UnmanagedMemoryStream),或者我提供的第二个版本的 ToByte(使用 Marshal 并复制数据)。 - poupou
我有一个NSObject,无法从中获取byte[];转换为NSData。根据您的答案,我将其转换为byte[]。感谢@poupou... - Vipin Krishna
NSData没有任何类型为Length的属性。 - Inshal Irshad

0

这也可以:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接