【问题标题】:Read hex file, convert to string and load to listBox读取 hex 文件,转换为字符串并加载到 listBox
【发布时间】:2012-05-09 15:18:03
【问题描述】:

我希望 listBox 显示存储在文件中的 ID。 ID 为十六进制值。

我一直在尝试加载文件并将 HEX 转换为 ASCII,因此 listBox 可以加载它。 该文件还包含更多信息,如项目名称、项目级别等......

这是一个文件示例:

00000000h: 50 12 00 00 2F D9 01 00 01 00 00 00 00 00 00 00 ; P.../Ù..........
00000010h: 46 65 61 74 68 65 72 20 45 61 72 72 69 6E 67 00 ; Feather Earring.
00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000040h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000050h: 00 00 00 00 0A 00 00 00 07 00 02 00 00 00 00 00 ; ................
00000060h: 00 00 00 00 00 00 00 00 00 00 00 00 B8 88 00 00 ; ............¸ˆ..
00000070h: 00 0C 00 00 00 00 00 00 00 00 00 00 20 00 00 00 ; ............ ...
00000080h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000090h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000100h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000110h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000120h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000130h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000140h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000150h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000160h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000170h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000180h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000190h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000001a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000001b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000001c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000001d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000001e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000001f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000200h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000210h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000220h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000230h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000240h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000250h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000260h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000270h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000280h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000290h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000002a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000002b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000002c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000002d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000002e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000002f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000300h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000310h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000320h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000330h: 02 00 00 00 00 00 00 00 4A 61 64 65 20 45 61 72 ; ........Jade Ear
00000340h: 72 69 6E 67 00 00 00 00 00 00 00 00 00 00 00 00 ; ring............
00000350h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000360h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000370h: 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 ; ................
00000380h: 07 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000390h: 00 00 00 00 20 A1 07 00 00 0C 00 00 00 00 00 00 ; .... ¡..........
000003a0h: 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 ; .... ...........
000003b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000003c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000003d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000003e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000003f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000400h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000410h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000420h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000430h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000440h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000450h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000460h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000470h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000480h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000490h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000004a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000004b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000004c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000004d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000004e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000004f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000500h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000510h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000520h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000530h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000540h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000550h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000560h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000570h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000580h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000590h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000005a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000005b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000005c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000005d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000005e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000005f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000600h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000610h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000620h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000630h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000640h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000650h: 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 ; ................

忽略开头的“50 12 00 00 2F D9 01 00”,即文件版本和其他不相关的数据,我要解析到listBox的是版本之后的项目ID“01”文件。

下一个项目 ID 为“00000330h”,值为“02”。在文件末尾,您可以看到 ID 为“03”...

编辑:

好的,现在我正在加载文件并读取其中的项目部分,但我不知道如何将 ID 加载到列表框中... ID 之间的间隔为 807 个字节,因此每 807 个字节就有一个 ID。

这是我加载文件部分的方式

    int itemSectionStart = 0x00000000;
    int itemSectionEnd = 0x002e11e0;

    FileStream fstream = new FileStream("C:\\Users\\xxx\\Desktop\\xxx\\xxx\\xxx.dec", FileMode.Open);
    BinaryReader breader = new BinaryReader(fstream);
    long length = fstream.Length;

    breader.BaseStream.Position = itemSectionStart;
    byte[] itemSection = breader.ReadBytes(itemSectionEnd);

【问题讨论】:

  • 这让我想起了 PC 保存游戏文件和拥有大量积分的 ELITE :)
  • 哈哈,是这样的:P
  • 不明白为什么要 hex 到 ascii 的转换?这个十六进制转储只是一些十六进制查看器中文件的视觉呈现吗?
  • 当我按下“加载”按钮时,listBox 必须加载所有项目 ID。 ID 采用 HEX 值,我希望这些值采用可读的 ASCII 格式。当它到达项目 ID“061A85”时,它将显示“400005”而不是 HEX 值。编辑:转储取自 UltraEdit 的文件视图
  • 如果您发布的十六进制是准确的,那么您的 ID 实际上是由 808 个字节分隔的,无论如何这更有意义。我的回答应该适用于您想要做的事情(用相关表达式填写“NeedToByteSwap”和“AddToListView”等位)。如果有什么你不明白的,我可以试着为你澄清。

标签: c# listview hex


【解决方案1】:

假设您知道如何在文件中找到所需的 ID,并且知道它们的宽度(例如,您知道它们是每个 4 个字节组成一个 Int32),您可以使用 C# 的 BitConverter 类,它需要一个字节数组和索引,并返回相应的数字类型。如果字节序是一个问题,您可能需要交换一些东西。

将您的文件读入字节数组,在您关心的每个偏移处使用 BitConverter,将数字转换为字符串,然后加载您的 ListView。

int startIndex = 8;
int recordStride = 128;
int numRecords = 4;

using (FileStream str = File.OpenRead("myfile.ext")) {
    for (int i = 0; i < numRecords; i++) {
        byte[] data = new byte[4];
        str.Seek(startIndex + recordStride * i, SeekOrigin.Begin);
        str.Read(data, 0, 4);
        if (NeedToByteSwap)
            Array.Reverse(data);

        int id = BitConverter.ToInt32(data, 0);
        AddToListView(id.ToString());
    }
}

根据需要填写或计算您的起始参数。

【讨论】:

    【解决方案2】:

    终于完成了我想要的! 这是我使它工作的方法:(可能不漂亮,但它有效!)

    private string hex2dec(string hexString)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append(long.Parse(hexString, System.Globalization.NumberStyles.HexNumber));
        return sb.ToString();
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        int numRecords = 3737;
        int itemSectionStart = 0x00000008;
        int itemSectionEnd = 0x002e11ec;
    
        using (FileStream str = File.OpenRead("C:\\Users\\xxx\\Desktop\\xxx\\xxx\\xxx.dec"))
        {
            BinaryReader breader = new BinaryReader(str);
            breader.BaseStream.Position = itemSectionStart;
            byte[] itemSection = breader.ReadBytes(itemSectionEnd);
    
            int j = 0;
            int k = j++;
            for (int i = 0; i < numRecords; i++)
            {
                string id = BitConverter.ToString(itemSection, 808 * k++, 7);
                string[] strArrayID = id.Split(new char[] { '-' });
                string reversedID = strArrayID[6] + strArrayID[5] + strArrayID[4] + strArrayID[3] + strArrayID[2] + strArrayID[1] + strArrayID[0];
                listBox1.Items.Add(this.hex2dec(reversedID));
            }
        }
    }
    

    【讨论】:

    • 我不确定我是否理解您将其视为十六进制字符串的固定。您打算在其他地方使用十六进制字符串吗?为方便起见,您的文本编辑器以十六进制显示您的数据,但底层 id 数据与十六进制或 ASCII 无关。如果您的代码可以正常工作,那就太好了,但我认为您所做的工作比您真正需要做的要多得多。
    • 如果它没有坏,就不要修理它,它对我来说很好用。
    【解决方案3】:

    听起来不像是十六进制格式的数据——听起来更像是编辑器给你的表示。相反,该文件似乎更有可能是一个直接的二进制转储,其文本编码为 ASCII 字节流。

    在这种情况下,您希望隔离代表字符的 byte[] 范围(是否有明确的定义来分隔记录、名称等?)。喂它 System.Text.ASCIIEncoding (http://msdn.microsoft.com/en-us/library/system.text.asciiencoding.aspx)

    GetString 重载之一会将字节范围转换为 ASCII 文本。 (http://msdn.microsoft.com/en-us/library/744y86tc.aspx)

    【讨论】:

    • ID 相距 807 个字节,中间还有关于每个项目的其他数据。这些值是十六进制的,但它们是“反转的”,因此文件将显示“32 DF 14 3C”反转的十六进制值,实际上是“3C 14 DF 32”,并将转换为十进制形式的“1008000818”。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    相关资源
    最近更新 更多