代码之家  ›  专栏  ›  技术社区  ›  fonix232

C#替换二进制文件中的十六进制

  •  3
  • fonix232  · 技术社区  · 15 年前

    我有一个二进制文件,其中有一些值应该更改。 更确切地说,在文件的两个部分,在开头,有两个十六进制值

    66 73 69 6D 35 2E 36 39
    

    应该改成什么

    4D 53 57 49 4E 34 2E 31
    

    1 回复  |  直到 15 年前
        1
  •  4
  •   Timwi    15 年前

    这是我写的一个方法,你可以用它来找到你的 byte[] 字节是您要查找的。

    /// <summary>
    /// Searches the current array for a specified subarray and returns the index
    /// of the first occurrence, or -1 if not found.
    /// </summary>
    /// <param name="sourceArray">Array in which to search for the
    /// subarray.</param>
    /// <param name="findWhat">Subarray to search for.</param>
    /// <param name="startIndex">Index in <paramref name="sourceArray"/> at which
    /// to start searching.</param>
    /// <param name="sourceLength">Maximum length of the source array to search.
    /// The greatest index that can be returned is this minus the length of
    /// <paramref name="findWhat"/>.</param>
    public static int IndexOfSubarray<T>(this T[] sourceArray, T[] findWhat,
            int startIndex, int sourceLength) where T : IEquatable<T>
    {
        if (sourceArray == null)
            throw new ArgumentNullException("sourceArray");
        if (findWhat == null)
            throw new ArgumentNullException("findWhat");
        if (startIndex < 0 || startIndex > sourceArray.Length)
            throw new ArgumentOutOfRangeException();
        var maxIndex = sourceLength - findWhat.Length;
        for (int i = startIndex; i <= maxIndex; i++)
        {
            if (sourceArray.SubarrayEquals(i, findWhat, 0, findWhat.Length))
                return i;
        }
        return -1;
    }
    
    /// <summary>Determines whether the two arrays contain the same content in the
    /// specified location.</summary>
    public static bool SubarrayEquals<T>(this T[] sourceArray,
            int sourceStartIndex, T[] otherArray, int otherStartIndex, int length)
            where T : IEquatable<T>
    {
        if (sourceArray == null)
            throw new ArgumentNullException("sourceArray");
        if (otherArray == null)
            throw new ArgumentNullException("otherArray");
        if (sourceStartIndex < 0 || length < 0 || otherStartIndex < 0 ||
            sourceStartIndex + length > sourceArray.Length ||
            otherStartIndex + length > otherArray.Length)
            throw new ArgumentOutOfRangeException();
    
        for (int i = 0; i < length; i++)
        {
            if (!sourceArray[sourceStartIndex + i]
                .Equals(otherArray[otherStartIndex + i]))
                return false;
        }
        return true;
    }