十进制到字节数组并写入偏移量

本文关键字:偏移量 到字节 数组 十进制 | 更新日期: 2023-09-27 18:32:47

我想知道如何从文本框中的十进制数转换为十六进制,然后转换为字节数组,并将该数组写入我想要的偏移量,使用 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 执行此操作?

十进制到字节数组并写入偏移量

您不能将十进制转换为十六进制(您将如何处理分数部分?但您可以使用Int64long)代替:

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

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

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

bw.Write(asLong);

看了更多,似乎你在追求 4 字节的数字,所以整数不长。 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);

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

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

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

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

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

您可以使用 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);