我正试图从谷歌谈话获得阿凡达。 我收到来自goole talk服务器的数据包,如:
<presence from="xxxxxxxxxxxxx@gmail.com/MessagingA3e8c9465" to="xxxxxxxxxx@gmail.com/Jabber.NetF5D1AB65">
<show>away</show>
<caps:c ver="1.1" node="http://www.android.com/gtalk/client/caps" xmlns:caps="http://jabber.org/protocol/caps" />
<x xmlns="vcard-temp:x:update">
<photo>6373f2ccdf12ef06292ca2257dc0bdc9aa1040c2</photo>
</x>
我认为'<photo>'
标签的十六进制值是联系人的头像(显示图像)。 (如果我错了,请纠正我。)
我将该值转换为byte [] 并使用以下代码显示图像。
pictureBox1.Image = Image.FromStream(new MemoryStream(byte_array));
// byte_array is byte[] converted from hex value.
它提出异常说:
参数无效。
我使用以下函数从十六进制转换为字节[]:
private static byte[] HexString2Bytes(string hexString)
{
int bytesCount = (hexString.Length) / 2;
byte[] bytes = new byte[bytesCount];
for (int x = 0; x < bytesCount; ++x)
{
bytes[x] = Convert.ToByte(hexString.Substring(x * 2, 2), 16);
}
return bytes;
}
我尝试了许多方法但结果相同。
我也尝试将十六进制值转换为大写,但没有运气,结果相同。
我在Windows 8.1机器上使用.net 3.5。
由于
更新 感谢每一位人士的评论和回答。
我错误十六进制值不是头像(显示图片)。
我发送了&#39; iq&#39;请求服务器,它给出了头像。
非常感谢。 快乐的编码。
答案 0 :(得分:3)
http://www.xmpp.org/extensions/xep-0153.html说:
接下来,用户的客户端根据RFC 3174 [4]计算化身图像数据本身(不是base64编码版本)的SHA1哈希值。然后,该哈希被包括在用户的存在信息中,作为由&#39; vcard-temp:x:update&#39;所限定的元素的子元素的XML字符数据。命名空间,如以下示例所示:
示例3.用户的客户端在Presence Broadcast中包含头像哈希
所以,基本上十六进制的值是&#39;&#39;标签不是头像,而是头像图像的SHA1哈希。
答案 1 :(得分:1)
您看到的十六进制值不是联系人的显示图像。它是显示图像的哈希值。获取显示图像的逻辑如下:
有关XMPP数据包的详细信息请阅读http://www.xmpp.org/extensions/xep-0153.html#retrieve
上的第3.2节答案 2 :(得分:0)
根据this,照片是Base64编码的。因此,您只需调用Convert.FromBase64String即可从照片元素InnerText中获取字节数组。