aboutsummaryrefslogtreecommitdiff
path: root/Hotline/Utility
diff options
context:
space:
mode:
Diffstat (limited to 'Hotline/Utility')
-rw-r--r--Hotline/Utility/FoundationExtensions.swift51
1 files changed, 45 insertions, 6 deletions
diff --git a/Hotline/Utility/FoundationExtensions.swift b/Hotline/Utility/FoundationExtensions.swift
index 000314e..719df40 100644
--- a/Hotline/Utility/FoundationExtensions.swift
+++ b/Hotline/Utility/FoundationExtensions.swift
@@ -5,6 +5,24 @@ enum Endianness {
case little
}
+func detectStringEncoding(of data: Data) -> String.Encoding {
+// var nsString: NSString? = nil
+// guard case let rawValue = NSString.stringEncoding(for: data, encodingOptions: [.allowLossyKey: false], convertedString: nil, usedLossyConversion: nil) else {
+// print("NO ENCODING")
+// return nil
+// }
+
+ let rawValue = NSString.stringEncoding(for: data, encodingOptions: [.allowLossyKey: false], convertedString: nil, usedLossyConversion: nil)
+
+// let cfEnc: CFStringEncoding = CFStringConvertNSStringEncodingToEncoding(rawValue);
+
+// let encodingString: CFString? = CFStringGetNameOfEncoding(cfEnc)
+
+ print("DETECTED ENCODING \(rawValue)")
+
+ return String.Encoding(rawValue: rawValue)
+}
+
extension Data {
init(_ val: UInt8) {
self.init()
@@ -50,16 +68,37 @@ extension Data {
}
return self.subdata(in: offset..<(offset + length))
}
-
+
func readString(at offset: Int, length: Int) -> String? {
- var str: String?
+ let subdata = self[offset..<(offset + length)]
+ if subdata.count == 0 {
+ return ""
+ }
+
+ let allowedEncodings = [
+ NSUTF8StringEncoding,
+ NSShiftJISStringEncoding,
+ NSUnicodeStringEncoding,
+ NSWindowsCP1251StringEncoding
+ ]
+
+ var decodedNSString: NSString?
+ let rawValue = NSString.stringEncoding(for: subdata, encodingOptions: [.allowLossyKey: false], convertedString: &decodedNSString, usedLossyConversion: nil)
+
+ if allowedEncodings.contains(rawValue) {
+ return decodedNSString as? String
+ }
+
+ else if rawValue > 1 {
+ print("ENCODING FOUND \(rawValue)")
+ }
- str = String(data: self[offset..<(offset + length)], encoding: .utf8)
- if str == nil {
- str = String(data: self[offset..<(offset + length)], encoding: .ascii)
+ var macStr = String(data: subdata, encoding: .macOSRoman)
+ if macStr == nil {
+ macStr = String(data: subdata, encoding: .nonLossyASCII)
}
- return str
+ return macStr
}
func readPString(at offset: Int) -> (String?, Int) {