首页 > 解决方案 > 将字符串转换为十六进制后字符串中的奇数十六进制长度

问题描述

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

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 中允许的字符。

标签: c#

解决方案


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

MsgTitle: 64756D6D7920746578742068657265,
MsgBody: 64756D6D7920746578742068657265

这就是你表示数字的方式。对于strings,您需要引号,如下所示:

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 - 并且更容易编写正确的代码。


推荐阅读