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

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

正如标题所说,我一直在研究 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 返回的十六进制字符串:84 3D 17 B0 1E 08 04 00 02 63 B5 F6 B9 BE 77 1D

解决方法

我已经检查了 the source code

看起来这两个 Task<byte[]> GetData Task SetData 方法都没有任何特殊的逻辑来转换数据。数据只是保存(和读取)为 byte[]

我想您必须联系编写了您要读取的数据的作者/公司。

预期输出:1206058

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

是否有可能 blocksector 值不正确?

,

如果 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"

可能只是需要定义正确的编码。

,

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

// 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();

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?