我正在使用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 :(得分:0)
C#将字符串存储为每个字符串在内存中的两个字节,因此对于正常的0-127个ascii值,比如说“ABC”,它将在内存中具有0x41,0x00,0x42,0x00,0x43,0x00的模式。
libspotify的documentation显示sp_playlistcontainer_add_new_playlist
将const char*
作为其第二个参数。
因此,spotify lib将两个字节字符的第一个字节视为您发送它的字符串的第一个字母,然后它会看到unicode字符的第二个字节,即0x00。因为它认为它处理单个字节字符串而C结束字符串为0x00,所以它将其作为字符串的结尾处理。
在将字符串传递给api之前,尝试使用ASCIIEncoding.GetBytes将字符串编码为字节数组中的单个字符串。