如何在 C# 中将 json 转换为十六进制
How to convert json to hexadecimal in c#
我有 json 字符串,如下例所示
{"SaleToPOIRequest":{"MessageHeader":{"ProtocolVersion":"2.0","MessageClass":"Service","MessageCategory":"Login","MessageType":"Request","ServiceID":"498","SaleID":"SaleTermA","POIID":"POITerm1"},"LogoutRequest":{}}}
我想将 json 请求转换为十六进制。我尝试了此 link 中的示例,但由于 {,:,",}
值,我无法获得准确的转换。
实际上我可以获得十六进制 return 但是当我重新转换为字符串时我得到 return 如下
{"SaleToPOIReque§7B#§²$ÖW76vTVder":{"ProtocolV¦W'6öâ#¢#"ã"Â$ÚessageClass":"Se§'f6R"Â$ÖW76vT:ategory":"Login"¢Â$ÖW76vUGR#¢*Request","Servic¤B#¢#C"Â%6ÆZID":"SaleTermA",¢%ôB#¢%ôFW&Ú1"},"LogoutReque§7B#§·×
这对我没用
有什么办法可以转换吗?
所以基本上问题不仅在于转换为十六进制,还在于转换回来。
这只不过是结合 SO 上已有的 2 个答案:
首先我们使用此处给出的答案进行转换:Convert string to hex-string in C#
那么对于转换回来你可以使用这个答案:
对你来说它看起来像这样:
class Program
{
static void Main(string[] args)
{
var input = "{\"SaleToPOIRequest\":{\"MessageHeader\":{\"ProtocolVersion\":\"2.0\",\"MessageClass\":\"Service\",\"MessageCategory\":\"Login\",\"MessageType\":\"Request\",\"ServiceID\":\"498\",\"SaleID\":\"SaleTermA\",\"POIID\":\"POITerm1\"},\"LogoutRequest\":{}}}";
var hex = string.Join("",
input.Select(c => String.Format("{0:X2}", Convert.ToInt32(c))));
var output = Encoding.ASCII.GetString(FromHex(hex));
Console.WriteLine($"input: {input}");
Console.WriteLine($"hex: {hex}");
Console.WriteLine($"output: {output}");
Console.ReadKey();
}
public static byte[] FromHex(string hex)
{
byte[] raw = new byte[hex.Length / 2];
for (int i = 0; i < raw.Length; i++)
{
raw[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
}
return raw;
}
}
在此处的 fiddle 中查看实际操作:
https://dotnetfiddle.net/axUC5n
希望这对您有所帮助,祝您项目顺利
您最有可能使用 Encoding.Unicode
将字符串转换为字节数组:某些字符很可能无法用 ASCII 字符表示。
Encoding.Unicode
(UTF-16LE
) 总是使用 2 个字节,所以它是可预测的:HEX 字符串中的 4 个字符序列将始终代表一个 UFT-16
代码点。
不管输入字符串包含什么字符。
将字符串转换为十六进制:
string input = "Yourstring \"Ваша строка\"{あなたのひも},آپ کی تار";;
string hex = string.Concat(Encoding.Unicode.GetBytes(input).Select(b => b.ToString("X2")));
转换回字符串:
var bytes = new List<byte>();
for (int i = 0; i < hex.Length; i += 2) {
bytes.Add(byte.Parse(hex.Substring(i, 2), NumberStyles.HexNumber));
}
string original = Encoding.Unicode.GetString(bytes.ToArray());
我有 json 字符串,如下例所示
{"SaleToPOIRequest":{"MessageHeader":{"ProtocolVersion":"2.0","MessageClass":"Service","MessageCategory":"Login","MessageType":"Request","ServiceID":"498","SaleID":"SaleTermA","POIID":"POITerm1"},"LogoutRequest":{}}}
我想将 json 请求转换为十六进制。我尝试了此 link 中的示例,但由于 {,:,",}
值,我无法获得准确的转换。
实际上我可以获得十六进制 return 但是当我重新转换为字符串时我得到 return 如下
{"SaleToPOIReque§7B#§²$ÖW76vTVder":{"ProtocolV¦W'6öâ#¢#"ã"Â$ÚessageClass":"Se§'f6R"Â$ÖW76vT:ategory":"Login"¢Â$ÖW76vUGR#¢*Request","Servic¤B#¢#C"Â%6ÆZID":"SaleTermA",¢%ôB#¢%ôFW&Ú1"},"LogoutReque§7B#§·×
这对我没用
有什么办法可以转换吗?
所以基本上问题不仅在于转换为十六进制,还在于转换回来。
这只不过是结合 SO 上已有的 2 个答案:
首先我们使用此处给出的答案进行转换:Convert string to hex-string in C#
那么对于转换回来你可以使用这个答案:
对你来说它看起来像这样:
class Program
{
static void Main(string[] args)
{
var input = "{\"SaleToPOIRequest\":{\"MessageHeader\":{\"ProtocolVersion\":\"2.0\",\"MessageClass\":\"Service\",\"MessageCategory\":\"Login\",\"MessageType\":\"Request\",\"ServiceID\":\"498\",\"SaleID\":\"SaleTermA\",\"POIID\":\"POITerm1\"},\"LogoutRequest\":{}}}";
var hex = string.Join("",
input.Select(c => String.Format("{0:X2}", Convert.ToInt32(c))));
var output = Encoding.ASCII.GetString(FromHex(hex));
Console.WriteLine($"input: {input}");
Console.WriteLine($"hex: {hex}");
Console.WriteLine($"output: {output}");
Console.ReadKey();
}
public static byte[] FromHex(string hex)
{
byte[] raw = new byte[hex.Length / 2];
for (int i = 0; i < raw.Length; i++)
{
raw[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
}
return raw;
}
}
在此处的 fiddle 中查看实际操作:
https://dotnetfiddle.net/axUC5n
希望这对您有所帮助,祝您项目顺利
您最有可能使用 Encoding.Unicode
将字符串转换为字节数组:某些字符很可能无法用 ASCII 字符表示。
Encoding.Unicode
(UTF-16LE
) 总是使用 2 个字节,所以它是可预测的:HEX 字符串中的 4 个字符序列将始终代表一个 UFT-16
代码点。
不管输入字符串包含什么字符。
将字符串转换为十六进制:
string input = "Yourstring \"Ваша строка\"{あなたのひも},آپ کی تار";;
string hex = string.Concat(Encoding.Unicode.GetBytes(input).Select(b => b.ToString("X2")));
转换回字符串:
var bytes = new List<byte>();
for (int i = 0; i < hex.Length; i += 2) {
bytes.Add(byte.Parse(hex.Substring(i, 2), NumberStyles.HexNumber));
}
string original = Encoding.Unicode.GetString(bytes.ToArray());