播放列表仅具有给定名称的第一个字母

时间:2014-12-22 11:15:03

标签: c# libspotify

我正在使用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?

感谢。

1 个答案:

答案 0 :(得分: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将字符串编码为字节数组中的单个字符串。