     /// - Parameters:
     ///   - string: The string data to wrap. The string gets converted to UTF8 data before being fed to the encoder closure.
     ///   - coders: The encoder/decoder pair which performs the conversion between external and internal representations. If nil, the default XOR coders will be used.
-    public init(_ string: String, _ coders: (encoder: FFDataWrapperCoder, decoder: FFDataWrapperCoder)? = nil)
+    ///   - encode: If true, encoder will be applied to the provided string; if false, the string will be assumed to already contain
+    ///          already encoded underlying representation.
+    public init(_ string: String,
+                _ coders: (encoder: FFDataWrapperCoder, decoder: FFDataWrapperCoder)? = nil,
+                _ encode: Bool = true)
     {
         self.coders = coders ?? FFDataWrapperEncoders.xorWithRandomVectorOfLength(string.utf8.count).coders
         

        {
            // Obfuscate the data
            utf8.withUnsafeBytes {
                self.coders.encoder(UnsafeBufferPointer(start: $0.baseAddress!.assumingMemoryBound(to: UInt8.self), count:length),
                                    UnsafeMutableBufferPointer(start: self.dataRef.dataBuffer.baseAddress!, count:length))
            }
        }
    }

        }
        
        try initializer(UnsafeMutableBufferPointer(start: tempBufferPtr, count: length))
        let encoder = encode ? self.coders.encoder : FFDataWrapperEncoders.identity.coders.encoder
        self.coders.encoder(UnsafeBufferPointer(start: tempBufferPtr, count: length),
                            UnsafeMutableBufferPointer(start: self.dataRef.dataBuffer.baseAddress!, count: length))
    }
    
    
