Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
libspotify:What can I and can';我不能使用图像ID吗?_Spotify_Libspotify - Fatal编程技术网

libspotify:What can I and can';我不能使用图像ID吗?

libspotify:What can I and can';我不能使用图像ID吗?,spotify,libspotify,Spotify,Libspotify,各种libspotify API函数处理图像ID: 它们都以常量字节的形式返回图像ID*: sp_album_cover sp_artist_portrait sp_artistbrowse_portrait sp_image_image_id sp\u image\u create将图像ID参数作为const byte[20],而sp\u playlist\u get\u image将图像ID参数作为byte[20]并用图像ID值填充 在这个问题中,Spotify的一名员工表示,图像ID的内

各种libspotify API函数处理图像ID:

它们都以常量字节的形式返回图像ID*:

sp_album_cover
sp_artist_portrait
sp_artistbrowse_portrait
sp_image_image_id
sp\u image\u create
将图像ID参数作为
const byte[20]
,而
sp\u playlist\u get\u image
将图像ID参数作为
byte[20]
并用图像ID值填充

在这个问题中,Spotify的一名员工表示,图像ID的内容不透明,20的大小不一定是图像ID的准确长度:

sp_image_create采用20字节长的image_id参数。这是否意味着图像id的最大长度为20字节

不,sp_订户是我们为编译器输入假数字的另一个例子。图像id指针的内容不透明,可能会在不同版本之间更改。不要编写对它们做出假设的代码,因为这样会破坏它们

但是,为了使用sp_playlist_get_image,调用者需要分配数组来存储图像ID。这似乎是不一致的建议,或者至少令人惊讶。以下哪项是正确的

  • 解释A:图像ID始终正好是20个字节
  • 解释B:图像ID的长度可能不超过20字节
  • 解释C:图像ID可以是任意长度,但是
    sp\u playlist\u get\u Image
    返回的图像ID保证不超过20字节
  • 解释D:图像ID可以是任意长度,并且
    sp\u playlist\u get\u Image
    根本无法安全使用
我认为这个问题的答案排除了A和B的可能性,所以我认为答案可能是C,尽管这很令人沮丧。一个彻底的悲观主义者可能会赞同D


我之所以感兴趣,是因为我试图编写一个比现有的更安全、更高级的.NET包装器,而且我不确定如何在托管代码中显示图像ID。我认为它的唯一用途是有两种替代实现—一种是20字节的缓冲区,表示从
sp_playlist\u get_image
返回的图像ID,另一种是IntPtr,表示从其他任何东西返回的图像ID。如果库对图像ID的大小和性质做出了足够的保证,我可以随时使用自己的缓冲区,并在必要时复制到其中,但我担心libspotify不太可能做出足够强的保证来实现这一点。

对于当前版本的libspotify,解释C对于该特定调用是正确的。由于它需要字节[20],因此该函数保证如果分配20个字节,您将始终有足够的空间容纳播放列表的图像ID。如果这保证了将来的更改,则函数签名将被更改,前提是我们尚未使其与其他所有功能一样工作

考虑到API的状态,您的混合解决方案现在听起来是最好的。使用
IntPtr
,当讨厌的
sp_playlist_get_image
消失后,您将可以更好地应对未来


我希望你的项目进展顺利-我们一直希望有一个像样的.NET包装多年,但从来没有时间做整个事情自己。如果它是开源的,我很乐意贡献

其目的是开放源代码。我希望在下个月左右把它放到github上。当我这样做的时候,它会在某个地方。前面提到的C#包装器库现在在这里:你有播放列表的imageID吗?我将其与Byte[]类型一起用于互操作调用,我传入的缓冲区似乎从未被libspotfiy..EDIT填充或更改。似乎我必须传入一个IntPtr,指向Marshal.AllocHGlobal函数分配的缓冲区。