0

我想知道如何将文本框中的十进制数转换为十六进制,然后转换为字节数组,然后使用 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 做到这一点?

4

3 回答 3

3

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

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

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

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

bw.Write(asLong);

再看这个,似乎你在寻找 4 字节的数字,所以 ints 不是 longs。很好,但是它以与您可能想要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);
于 2012-05-01T23:06:35.820 回答
3

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

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

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

var bytes = BitConverter.GetBytes(int.Parse(textBox11.Text));
Array.Reverse(bytes);
bw.Write(bytes);
于 2012-05-01T23:19:23.297 回答
2

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

您使用该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-05-01T23:10:51.693 回答