【问题标题】:Decimal to ByteArray & write to offset十进制到字节数组并写入偏移量
【发布时间】:2012-05-11 10:38:48
【问题描述】:

我想知道如何使用 BinaryWriter 将文本框中的十进制数转换为十六进制,然后再转换为字节数组,然后将此数组写入我想要的偏移量。

我的 textBox11 十进制值为“101200001”,我需要将它的十六进制值“06 08 30 81”写入文件中的特定偏移量。

这就是我所拥有的,但我错过了从 textBox11.Text 到 byteArray 的转换。

    int index = listBox1.SelectedIndex;
    int startOffset = 0x00000008;
    int itemIDDiff = 0x00000328;

    BinaryWriter bw = new BinaryWriter(File.Open(_FileName, FileMode.Open));
    bw.BaseStream.Seek(startOffset + itemIDDiff * index, SeekOrigin.Begin);
    bw.Write( /* textBox11.Text converted to HEX then to byte array? */ );
    bw.Close();

这是我需要写入的文件的一部分:

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............

假设我想将“02 00 00 00”更改为“06 08 30 81”。我将如何使用 BinaryWriter 做到这一点?

【问题讨论】:

    标签: c# hex bytearray decimal binarywriter


    【解决方案1】:

    您无法将十进制转换为十六进制(您将如何处理小数部分?)。但你可以改用Int64long):

    var text = "101200001";
    var asLong = Convert.ToInt64(text);
    var asHex = asDecimal.ToString("X");
    

    asHex 现在有了你想要的十六进制字符串。

    但是您遇到的问题是“十六进制”实际上只是一种查看磁盘上一组原始字节的方式。数字以原始字节表示的方式取决于程序本身。如果你有一个二进制写入器,你只需要知道你试图写入的数字的字节表示。这本身可能就足够了(无需转换为字符串):

    bw.Write(asLong);
    

    再看这个,好像你在寻找 4 字节的数字,所以 int 不是 long。 BitConverter 很好,但它以与您可能想要的相反顺序写入所有内容。因此,请记住这些并查看以下内容:

    var text = "101200001";
    var asInt = Convert.ToInt32(text);                    // 4 byte number
    var asBytes = BitConverter.GetBytes(asInt).Reverse(); // same hex representation as a byte array (same order)
    

    所以在你的例子中添加这个:

    bw.Write(asBytes);
    

    【讨论】:

    • 这是我需要写入的文件的一部分: 00000330h: 02 00 00 00 00 00 00 00 4A 61 64 65 20 45 61 72 ; ........玉耳 00000340h: 72 69 6E 67 00 00 00 00 00 00 00 00 00 00 00 00 ;环............假设我想将“02 00 00 00”更改为“06 08 30 81”,我该怎么做?
    【解决方案2】:

    不清楚是否需要小端或大端。小端很简单:

    bw.Write(int.Parse(textBox11.Text));
    

    对于问题中建议但不寻常的大端序,您必须颠倒字节顺序:

    var bytes = BitConverter.GetBytes(int.Parse(textBox11.Text));
    Array.Reverse(bytes);
    bw.Write(bytes);
    

    【讨论】:

      【解决方案3】:

      可以将数字转换为十六进制表示,然后对其进行解析,但这完全没有意义。

      您使用Int32.Parse 方法将字符串解析为数字,然后使用BitConverter.GetBytes 方法将数字作为字节数组获取:

      byte[] data = BitConverter.GetBytes(Int32.Parse(textBox11.Text));
      

      然后将字节写入流:

      bw.Write(data, 0, data.Length);
      

      请注意,这会将字节 81, 30, 08 06 写入具有小端序数表示的系统上的流,例如基于 Intel(或兼容)CPU 的计算机。如果您想要文件中的大端表示,则必须在写入之前反转数组:

      Array.Reverse(data);
      

      【讨论】:

        猜你喜欢
        • 2012-03-04
        • 2012-01-06
        • 2012-07-12
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 2018-08-27
        • 1970-01-01
        • 2014-06-09
        相关资源
        最近更新 更多