2014-12-22 77 views
0

我正在創建一個使用C#和LibspotifyDotNet進行訪問的Spotify客戶端。播放列表只有給定名稱的第一個字母

我正在實現一個方法,該方法將使用給定的名稱在用戶的默認會話容器中創建一個新的播放列表。它的工作,有點。除了播放列表總是將其名稱設置爲我輸入的第一個字母,而不是整個字符串。

這裏是我使用

public IntPtr CreateNewPlaylist(string name) 
{ 
    IntPtr namePointer = IntPtr.Zero; 
    try 
    { 
     var sessionContainerPointer = libspotify.sp_session_playlistcontainer(GetSession()); 
     namePointer = Marshal.StringToHGlobalUni(name); 
     var newPointer = libspotify.sp_playlistcontainer_add_new_playlist(sessionContainerPointer, namePointer); 
     return newPointer; 
    } 
    finally 
    { 
     if (namePointer != IntPtr.Zero) 
      Marshal.FreeHGlobal(namePointer); 
    } 
} 

我已驗證namePointer將其改回爲一個字符串,看看它返回確實確實點到整個字符串代碼。我們都很好。

我在這裏錯過了一些明顯的東西嗎?或者這是一個LibspotifyDotNet問題?還是一個Libspotify的?

謝謝。

回答

0

C#在內存中將字符串存儲爲每個字符串兩個字節,因此對於正常的0-127 ascii值(如「ABC」),它將在內存中具有0x41,0x00,0x42,0x00,0x43,0x00的模式。

用於libspotify的documentation顯示sp_playlistcontainer_add_new_playlistconst char*作爲其第二個參數。

所以spotify lib將兩個字節字符的第一個字節看作你發送字符串的第一個字母,然後它看到unicode字符的第二個字節,它是0x00。由於它認爲它是處理單個字節的字符串,並且C以0x00結束字符串,因此它會將其作爲字符串的結尾進行處理。

嘗試在將字符串傳遞給api之前,使用ASCIIEncoding.GetBytes將字符串編碼爲字節數組中的單個字符串。

+0

感謝您的回答。那麼你是說使用Encoding.X.GetBytes來獲取字節數組並將其複製到內存中並使用該指針?我一直認爲這將是StringToHGlobalUni的工作方式,但我想不是那樣。 –

+0

是的,使用ASCIIEncoding或UTF8Encoding。 StringToHGlobalUni只是分配一個非託管緩衝區並將字符串的數據複製到它。 –

+1

太棒了!它現在按預期工作。謝謝。 –

相關問題