文章目錄
- DecryptData 解密介面回傳 `10008`錯誤
- encrypt_random_key 用 rsa 私鑰解密問題
- DecryptData 解密 回傳值亂碼問題,
- 讀取媒體資訊問題,
點我跳轉查看Demo原始碼 😜
最近在研究企業微信會話記錄同步的內容,發現官方的檔案有些地方寫的不是很清楚,再加上沒有.NET 版本的SDK,只好根據其他兩個版本的Demo 猜測.NET 應該怎么寫,在其中遇到過很多坑,比如
1.DecryptData 解密介面回傳 10008錯誤,
2. encrypt_random_key 用 rsa 私鑰解密問題
3. DecryptData 解密 回傳值亂碼問題,
4. 讀取媒體資訊問題,
以上問題會在下面一一解答,
DecryptData 解密介面回傳 10008錯誤
這里我剛開始除錯的時候,卡了好久,還是在社區加了一個好兄弟qq 才解決 😄
從 java 的 demo 復制過來的DecryptData方法 有一個 SDK 的引數,在.net 這邊沒有,去掉那個sdk 引數就好了
encrypt_random_key 用 rsa 私鑰解密問題
這里企業微信的檔案也有些不是很清楚,這里先要將encrypt_random_key 用 base64解密后,再用私鑰解密,下面是解密的方法
/// <summary>
/// RAS 私鑰解密
/// </summary>
/// <param name="privateKey"></param>
/// <param name="text"></param>
/// <returns></returns>
public static string Decrypt(string privateKey, string text)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] byteKeys = Convert.FromBase64String(text);
rsa.FromXmlString(privateKey);
var cByte = rsa.Decrypt(byteKeys, false);
return System.Text.Encoding.UTF8.GetString(cByte);
}
RSA 公 私鑰 在網上生成就OK,生成之后將 pem格式轉換成 XML 格式的,在線轉換地址
DecryptData 解密 回傳值亂碼問題,
這個問題也是搞了好久,曾經一度以為 企業微信給的SDK 有問題,哈哈,后面一想應該不太可能,還是繼續相信他,懷疑是我們用法的問題,
亂碼問題,一看就知道是編碼問題,以前也沒有深入了解,也不知道怎么解決,今天翻遍了網上各種資料,最后終于搞定,
有兩種方法,第一種如下,UTF8Marshaler 在Demo 里面有
/**
* @brief 獲取slice內容
* @return 內容
*/
[DllImport(DllName)]
// IntPtr 換成 String 就需要將下面這個注釋啟用
//[return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]
public extern static IntPtr GetContentFromSlice(long slice);
第二種 回傳一個指標句柄 IntPtr
int len = Finance.GetSliceLen(slice);
byte[] vbyte = new byte[len];
var intPtr = Finance.GetContentFromSlice(slice);
System.Runtime.InteropServices.Marshal.Copy(intPtr, vbyte, 0, vbyte.Length);
return Encoding.UTF8.GetString(vbyte);
主要是 System.Runtime.InteropServices 這個命名空間下的 Marshal 類,今天發現這個類,封裝了好多方法,
上文用到的 Copy 方法 就可以將 非托管記憶體的位元組,轉到托管記憶體中,然后我們用UTF8 編碼解碼就好了,下圖可以看出,我們的中文都沒有亂碼,

讀取媒體資訊問題,
首先我們將 Finance.GetData 這個方法 的回傳值也改成 IntPtr,然后我們根據上文相同的方式
var lpByte = Finance.GetData(media_data);
int len = Finance.GetDataLen(media_data);
var bytes = new Byte[len];
System.Runtime.InteropServices.Marshal.Copy(lpByte, bytes, 0, bytes.Length);
最后我們將 byte 陣列保持相應的媒體檔案就可以了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/135723.html
標籤:其他
上一篇:JAVA文本檔案保存以及追加內容
下一篇:OFDM的PAPR技術的討論
