将字符串转换为十六进制后,字符串中的奇数十六进制长度

时间:2018-12-07 07:21:13

标签: c#

我需要通过服务器发送消息。消息参数为: MsgTitle MsgBody 。 我需要将消息从缓冲区转换为十六进制,但出现错误:

  

Newtonsoft.Json.JsonReaderException:'输入字符串   '64756D6D7920746578742068657265'不是有效的数字。

这是我正在使用的JSON数据:

var json = @"{
Mess: [
      {
      Msg: {
            MsgTitle: " + hex + @",
            MsgBody: " + hex + @"
           }
      }
      ]
}";

我为解决该问题而实施的代码:

string msg = "dummy text here";
byte[] utfBytes = System.Text.Encoding.UTF8.GetBytes(msg);
string hex = BitConverter.ToString(utfBytes).Replace("-", "");

我还尝试了很多在这里找到的HEX转换器函数,但是似乎它们都没有起作用,而且我不明白我在做什么错。另外,有人告诉我,URL中只允许使用字符。

1 个答案:

答案 0 :(得分:7)

问题是您的JSON包含以下属性:

MsgTitle: 64756D6D7920746578742068657265,
MsgBody: 64756D6D7920746578742068657265

这就是您表示数字的方式。对于字符串,您需要使用引号,例如:

MsgTitle: "64756D6D7920746578742068657265",
MsgBody: "64756D6D7920746578742068657265"

此外,属性的名称也应该用引号引起来:

"MsgTitle": "64756D6D7920746578742068657265",
"MsgBody": "64756D6D7920746578742068657265"

避免此类问题的最简单方法是首先不要将JSON直接构造为字符串。而是使用JSON API,例如Json.NET。这是使用匿名类型执行此操作的示例代码,尽管还有其他多种方法:

using System;
using System.Text;
using Newtonsoft.Json;

public class Program
{
    public static void Main()
    {
        string msg = "dummy text here";
        byte[] utfBytes = System.Text.Encoding.UTF8.GetBytes(msg);
        string hex = BitConverter.ToString(utfBytes).Replace("-", "");

        var obj = new
        {
            Mess = new[]
            {
                new
                {
                    Msg = new
                    {
                        MsgTitle = hex,
                        MsgBody = hex
                    }
                }
            }
        };

        string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
        Console.WriteLine(json);
    }
}

输出:

{
  "Mess": [
    {
      "Msg": {
        "MsgTitle": "64756D6D7920746578742068657265",
        "MsgBody": "64756D6D7920746578742068657265"
      }
    }
  ]
}

现在是有效的JSON-更容易编写正确的代码。