         let parser = BinarySpecParser(variablePrefix: variablePrefix)
         parser.parse(string)
         self = parser.spec
+    }
+
+    public var description: String {
+        switch self {
+        case let .Skip(a):
+            return "\(a)x"
+        case .Stop:
+            return "/*Stop*/"
+        case let .Integer(a):
+            return a.description
+        case let .Variable(a, _, offset):
+            if offset < 0 {
+                return "%\(offset)\(a)"
+            } else if offset > 0 {
+                return "%+\(offset)\(a)"
+            } else {
+                return "%\(a)"
+            }
+        case let .Bytes(a):
+            return "\(a)$s"
+        case let .Seq(a):
+            return "[\(a.lazy.map { $0.description }.joinWithSeparator(" "))]"
+        case let .Until(a, b):
+            return "\(a)$(\(b))"
+        case let .Repeat(a, b):
+            return "\(a)$*(\(b))"
+        case let .Switch(sel, cases, def):
+            return "\(sel)${\(cases.lazy.map { "\($0)=\($1)" }.joinWithSeparator(", ")), *=\(def)}"
+        }
     }
 }
 

        return withUnsafePointer(&prepared) {
            return dispatch_data_create(UnsafePointer($0), length, dispatch_get_main_queue(), DISPATCH_DATA_DESTRUCTOR_DEFAULT)
        }
    }
}


private let DISPATCH_DATA_DESTRUCTOR_DEFAULT: dispatch_block_t? = nil

/** Specification for an integer type. This structure defines how an integer is encoded in binary. */
public struct IntSpec: Equatable, CustomStringConvertible {
    /** Length of integer. Normally should be 1, 2, 4 or 8. */
    public let length: Int

