【问题标题】:Playlist only has first letter of given name播放列表只有名字的第一个字母
【发布时间】:2014-12-22 11:15:03
【问题描述】:

出于可访问性目的,我正在使用 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 ?

谢谢。

【问题讨论】:

    标签: c# libspotify


    【解决方案1】:

    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 将字符串编码为字节数组中的单个字符字符串。

    【讨论】:

    • 感谢您的回答。那么您是说使用 Encoding.X.GetBytes 获取字节数组并将其复制到内存中并使用该指针吗?我原以为这就是 StringToHGlobalUni 的工作方式,但我想那时不会。
    • 是的,使用 ASCIIEncoding 或 UTF8Encoding。 StringToHGlobalUni 只是分配一个非托管缓冲区并将字符串的数据复制到其中。
    猜你喜欢
    • 1970-01-01
    • 2012-07-15
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多