如何将接收到的十六进制字节解析为可读字符串



正如标题所说,我一直在读MiFare Classic的卡片。我正在使用NuGet 的MiFare v1.1.3库

它返回一个字节数组,我通过循环将其解析为可读的十六进制字符串

以下是代码片段:

int sector = 1;
int block = 0;
int size = 16;
var data = await localCard.GetData(sector, block, size);
string hexString = "";
for (int i = 0; i < data.Length; i++)
{
hexString += data[i].ToString("X2") + " ";
}
// hexString returns 84 3D 17 B0 1E 08 04 00 02 63 B5 F6 B9 BE 77 1D

现在,我如何正确解析它?

我试着把它解析成ASCII、ANSI、Int、Int64、Base64、Long并且所有的数据都不匹配它被认为包含的"数据">

编辑:预期输出:1206058返回的HEX字符串:84 3D 17 B0 1E 08 04 00 02 63 B5 F6 B9 BE 77 1D

我已经检查了源代码

看起来两个CCD_ 3和CCD_。数据仅保存(和读取(为byte[]

我想你必须联系写了你试图阅读的数据的作者/公司。

预期输出:1206058

看起来很奇怪,因为您正在读取16字节的size = 16,并且期望读取7个字符。

blocksector的值是否可能不正确?

我编写了一个简单的程序来解决您的问题。也许这就是你想要实现的:

// The original byte data array; some random data
byte[] data = { 0, 1, 2, 3, 4, 85, 128, 255 };
// Byte data -> Hex string
StringBuilder hexString = new StringBuilder();
foreach (byte item in data)
{
hexString.Append($"{item.ToString("X2")} ");
}
Console.WriteLine(hexString.ToString().Trim());
// Hex string -> List of bytes
string[] hexArray = hexString.ToString().Trim().Split(' ');
List<byte> dataList = new List<byte>();
foreach (string item in hexArray)
{
dataList.Add(byte.Parse(item, System.Globalization.NumberStyles.HexNumber));
}
dataList.ForEach(b => Console.Write($"{b} "));
Console.WriteLine();

如果这不是正确的解决方案,请向我们提供有关您的问题的更多信息。

如果var data可能是string,您可以通过以下操作将其从十六进制反转:

// To Hex
byte[] plainBytes = Encoding.ASCII.GetBytes("MiFare v1.1.3");
string hexString = "";
for (int i = 0; i < plainBytes.Length; i++)
hexString += plainBytes[i].ToString("X2") + " ";
Console.WriteLine(hexString); // Result: "4D 69 46 61 72 65 20 76 31 2E 31 2E 33"

// From Hex
hexString = hexString.Replace(" ", ""); // Remove whitespaces to have "4D69466172652076312E312E33"  
byte[] hexBytes = new byte[hexString.Length / 2];
for (int i = 0; i < hexString.Length / 2; i++)
hexBytes[i] = Convert.ToByte(hexString.Substring(2 * i, 2), 16);
string plainString = Encoding.ASCII.GetString(hexBytes);    
Console.WriteLine(plainString); // Result: "MiFare v1.1.3"

也许,只需要定义正确的编码。

相关内容

  • 没有找到相关文章

最新更新