C#参数不是有效例外

时间:2015-03-03 15:51:25

标签: c# image winforms .net-3.5

我正试图从谷歌谈话获得阿凡达。 我收到来自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;请求服务器,它给出了头像。

非常感谢。 快乐的编码。

3 个答案:

答案 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)

您看到的十六进制值不是联系人的显示图像。它是显示图像的哈希值。获取显示图像的逻辑如下:

  1. 在XMPP客户端登录后,您开始从XMPP服务器接收状态消息。
  2. 在状态消息中,您会收到头像的哈希值。
  3. 检查本地存储,如果您有针对收到的哈希的二进制图像。
  4. 如果你有一个针对哈希的二进制图像,那么从本地存储中显示客户端上的头像。
  5. 如果您没有针对哈希的二进制图像,请向XMPP服务器发送一个v-card请求,针对您接收该哈希的用户。
  6. 收到v-card响应后,您会找到哈希和显示图像二进制文件。将其存储在一些本地存储中。
  7. 有关XMPP数据包的详细信息请阅读http://www.xmpp.org/extensions/xep-0153.html#retrieve

    上的第3.2节

答案 2 :(得分:0)

根据this,照片是Base64编码的。因此,您只需调用Convert.FromBase64String即可从照片元素InnerText中获取字节数组。