【问题标题】:C# Parameter is not Valid ExceptionC# 参数不是有效异常
【发布时间】:2015-03-03 15:51:25
【问题描述】:

我正在尝试从 google talk 获取 Avatar。 我收到了来自 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>

我认为'&lt;photo&gt;' 标签的十六进制值是联系人的头像(显示图像)。 (如果我错了,请纠正我。)

我将该值转换为字节[] 并使用以下代码显示图像。

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。

谢谢

更新: 感谢大家的cmets和回答。

错了十六进制值不是头像(显示图像)。

我向服务器发送了“iq”请求,它给出了头像。

非常感谢。 快乐编码。

【问题讨论】:

  • 它看起来不像一些图像,只是因为它太短了——它只有 20 个字节。举个例子——典型的 16x16 像素 png 图像大约需要 800 字节。
  • 虽然不是 C#,this 的答案有一些您可能会觉得有用的信息。
  • 感谢@AndyKorneyev,这不是图片。
  • @SwDevMan81 感谢我知道 Delphi 的链接,该链接很有帮助。

标签: c# image winforms .net-3.5


【解决方案1】:

http://www.xmpp.org/extensions/xep-0153.html 说如下:

接下来,用户的客户端根据 RFC 3174 [4] 计算头像图像数据本身(不是 base64 编码版本)的 SHA1 哈希。然后,此哈希将作为由“vcard-temp:x:update”命名空间限定的元素的子元素的 XML 字符数据包含在用户的状态信息中,如下例所示:

示例 3. 用户的客户端在现场广播中包含 Avatar Hash

所以,''标签的十六进制值基本上不是头像,而是头像图像的SHA1哈希。

【讨论】:

    【解决方案2】:

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

    1. 在 XMPP 客户端登录后,您开始接收来自 XMPP 服务器的在线状态消息。
    2. 在状态消息中,您会收到头像的哈希值。
    3. 检查您的本地存储,如果您有针对接收到的哈希的二进制图像。
    4. 如果您有针对哈希的二进制图像,则从本地存储在您的客户端上显示头像。
    5. 如果您没有针对哈希的二进制图像,请向 XMPP 服务器发送一个 v-card 请求,用于您收到存在的用户。
    6. 收到 v-card 响应后,您会发现哈希和显示图像二进制文件。将其存储在某个本地存储中。

    有关 XMPP 数据包的详细信息,请阅读http://www.xmpp.org/extensions/xep-0153.html#retrieve 上的第 3.2 节

    【讨论】:

    • 感谢您的详细解答。我接受了它,现在我设法获得了真实的头像。感谢您的链接。 :)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 2011-07-17
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多