2012-05-16 82 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());