替换文件中的Hex字符串

时间:2013-08-07 08:44:45

标签: c# replace hex bytearray filestream

在我头上敲了几个小时后,我的智慧结束了。我在文件中有一个十六进制字符串,即“68 39 30 00 00”。 “39 30”是我想要替换的十进制值“12345”,而“68”和“00 00”只是为了确保单个匹配。

我想传入一个新的十进制值,例如“12346”,并替换文件中的现有值。我已经尝试将所有内容转换回来,并在十六进制,字节数组之间进行第四次转换,并且觉得它必须比我实现的要简单得多。

static void Main(string[] args)
{
    // Original Byte string to find and Replace "12345"
    byte[] original = new byte[] { 68, 39, 30, 00, 00 };

    int newPort = Convert.ToInt32("12346");
    string hexValue = newPort.ToString("X2");
    byte[] byteValue = StringToByteArray(hexValue);

    // Build Byte Array of the port to replace with. Starts with /x68 and ends with /x00/x00
    byte[] preByte = new byte[] { byte.Parse("68", System.Globalization.NumberStyles.HexNumber) };
    byte[] portByte = byteValue;
    byte[] endByte = new byte[] { byte.Parse("00", System.Globalization.NumberStyles.HexNumber), byte.Parse("00", System.Globalization.NumberStyles.HexNumber) };

    byte[] replace = new byte[preByte.Length + portByte.Length + endByte.Length];

    preByte.CopyTo(replace, 0);
    portByte.CopyTo(replace, preByte.Length);
    endByte.CopyTo(replace, (preByte.Length + portByte.Length));

    Patch("Server.exe", "Server1.exe", original, replace);
}

static private byte[] StringToByteArray(string hex)
{
    return Enumerable.Range(0, hex.Length)
                     .Where(x => x % 2 == 0)
                     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                     .ToArray();
}

1 个答案:

答案 0 :(得分:0)

39 30 的小数值为 14640 ,因此会检查不存在的14640.

12345 的十六进制值 30 39 。只需更正值,您的程序就可以正常工作。