forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Проверка целостности файла на примере XML. (http://forum.boolean.name/showthread.php?t=17789)

Lestar 25.01.2013 20:18

Проверка целостности файла на примере XML.
 
Иногда при разработке игрового приложения возникает необходимость в проверке целостности файлов. В моем конкретном случае Фиши требовали писать сохраненки в XML и к файлам было полное рукоприкладство со стороны QA. Небольшой класс дает нам возможность проверить ковырялся ли кто в наших файлах или нет. Обошелся без бородатой сериализации. На изменение межстрочного расстояния между дескрипторами логика глаза закрывает(нам оно по сути не важно, это не делает файл непригодным). Реализация удобная для меня. Может где лишнюю бороду и прикрутил, до этого с XML мало сталкивался.
Код:

public class Security : MonoBehaviour
{
    public TextAsset XMLSaveData;
    private XmlTextReader readerXML;
    byte[] HashValue;   
    private UnicodeEncoding UE;
    private string newHash;
    private byte[] SentHashValue;

    void Start()
    {
        ResultHashCompare();
    }

    bool ResultHashCompare() // Если хэши не равны, возвращаем false
    {
        if (XMLSaveData == null)
        {
            return false;
        }
        bool result=false;
        newHash = "";

        readerXML = new XmlTextReader(new StringReader(XMLSaveData.text));

        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.Load(readerXML);

        StringBuilder sb = new StringBuilder();
        sb.Append(xmlDocument.OuterXml);

        UE = new UnicodeEncoding();
        byte[] MessageBytes = UE.GetBytes(sb.ToString());

        SHA1Managed SHhash = new SHA1Managed();
        HashValue = SHhash.ComputeHash(MessageBytes);

        foreach (byte b in HashValue)
        {
            newHash += b + " ";
        }

        string oldHash = PlayerPrefs.GetString("HashSave");     

        result = StringCompare(newHash, oldHash);

        PlayerPrefs.SetString("HashSave", newHash);

        return result;
    }

    bool StringCompare(string newHash, string oldHash)
    {
        int rezult= String.Compare(newHash, oldHash, true);
        bool getBool = (rezult == 0) ? true : false;
        return getBool;
    }
}



Часовой пояс GMT +4, время: 13:04.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot