Показать сообщение отдельно
Старый 25.01.2013, 20:18   #1
Lestar
Бывалый
 
Аватар для Lestar
 
Регистрация: 24.05.2011
Адрес: Украина,Харьков
Сообщений: 890
Написано 359 полезных сообщений
(для 880 пользователей)
Проверка целостности файла на примере 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;
    }
}
__________________
Нам суждено построить мосты и храмы,которых никогда не существовало и не могло существовать в природе.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Andvrok (25.01.2013)