diff --git a/KaitaiStruct.cs b/KaitaiStruct.cs
index aa60c98..0fe152f 100644
--- a/KaitaiStruct.cs
+++ b/KaitaiStruct.cs
@@ -1,4 +1,5 @@
using System;
+using System.Text;
namespace Kaitai
{
@@ -34,4 +35,70 @@ public interface CustomDecoder
/// Source byte array.
byte[] Decode(byte[] src);
}
+
+ ///
+ /// Common ancestor for all error originating from Kaitai Struct usage.
+ /// Stores KSY source path, pointing to an element supposedly guilty of
+ /// an error.
+ ///
+ public class KaitaiStructError : Exception {
+ public KaitaiStructError(string msg, string srcPath)
+ : base(srcPath + ": " + msg)
+ {
+ this.srcPath = srcPath;
+ }
+
+ protected string srcPath;
+ }
+
+ ///
+ /// Common ancestor for all validation failures. Stores pointer to
+ /// KaitaiStream IO object which was involved in an error.
+ ///
+ public class ValidationFailedError : KaitaiStructError {
+ public ValidationFailedError(string msg, KaitaiStream io, string srcPath)
+ : base("at pos " + io.Pos + ": validation failed: " + msg, srcPath)
+ {
+ this.io = io;
+ }
+
+ protected KaitaiStream io;
+
+ protected static string ByteArrayToHex(byte[] arr) {
+ StringBuilder sb = new StringBuilder("[");
+ for (int i = 0; i < arr.Length; i++)
+ {
+ if (i > 0)
+ {
+ sb.Append(' ');
+ }
+ sb.Append(string.Format("{0:X2}", arr[i]));
+ }
+ sb.Append(']');
+ return sb.ToString();
+ }
+ }
+
+ ///
+ /// Signals validation failure: we required "actual" value to be equal to
+ /// "expected", but it turned out that it's not.
+ ///
+ public class ValidationNotEqualError : ValidationFailedError {
+ public ValidationNotEqualError(byte[] expected, byte[] actual, KaitaiStream io, string srcPath)
+ : base("not equal, expected " + ByteArrayToHex(expected) + ", but got " + ByteArrayToHex(actual), io, srcPath)
+ {
+ this.expected = expected;
+ this.actual = actual;
+ }
+
+ public ValidationNotEqualError(Object expected, Object actual, KaitaiStream io, string srcPath)
+ : base("not equal, expected " + expected + ", but got " + actual, io, srcPath)
+ {
+ this.expected = expected;
+ this.actual = actual;
+ }
+
+ protected Object expected;
+ protected Object actual;
+ }
}