我正在使用 PhotosPicker 庫來選擇影像或視頻并將其放入資料中:
@State private var selectedImageData: Data? = nil
我需要找出究竟選擇了什么。
我找到的所有答案都是關于如何使用路徑從檔案中檢索 meme 型別,但我沒有使用 PhotosPicker 獲取檔案路徑。
我在某個地方找到了這個:
extension Data {
private static let mimeTypeSignatures: [UInt8 : String] = [
0xFF : "image/jpeg",
0x89 : "image/png",
0x47 : "image/gif",
0x49 : "image/tiff",
0x4D : "image/tiff",
0x25 : "application/pdf",
0xD0 : "application/vnd",
0x46 : "text/plain",
]
var mimeType: String {
var c: UInt8 = 0
copyBytes(to: &c, count: 1)
return Data.mimeTypeSignatures[c] ?? "application/octet-stream"
}
}
它有效,但不完整,我還需要 mp4、mov 和盡可能多的
uj5u.com熱心網友回復:
例如,使用“mime types hexadecimal signatures”對 Google 進行快速研究將為您提供this或this ……
編輯
代碼中的簽名陣列讀取檔案的第一個資料位元組以確定其型別。
- 首先,根據我提供的鏈接,僅使用一個位元組可能不足以確定資料的型別(可以有多種型別具有相同的第一個位元組)。您應該首先修改您的代碼,以便簽名可以是幾個位元組長。
- 然后,您應該使用我提供的鏈接,即使使用不同的語言,您也可以獲得鏈接到相關格式的第一個位元組串列,以填充您的簽名陣列和相應的型別。
這是我所說的示例代碼:
extension Data
{
private static let mimeTypeSignatures: [([UInt8], String)] = [
([0x49, 0x49, 0x2A, 0x00], "image/tiff"),
([0x4D, 0x4D, 0x00, 0x2A], "image/tiff"),
([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], "image/png"),
//...
]
var mimeType: String
{
let tenFirstBytes = Array(subdata(in: 0..<10))
return Data.mimeTypeSignatures.filter
{ signature in
tenFirstBytes.starts(with: signature.0)
}
.first?.1 ?? "application/octet-stream"
}
}
它將資料的前 10 個位元組轉換為一個陣列,然后檢查每個 MIME 型別是否以 MIME 型別位元組開頭。(如果 MIME 簽名的長度超過 10 個位元組,則需要占用超過 10 個位元組)。
uj5u.com熱心網友回復:
您可以使用簽名在此處重新使用代碼
在復制粘貼邏輯并添加 tiff、vnd 或 text/plain 的案例后,您將得到以下邏輯:
enum ImageFormat {
case gif, jpg, png, vnd, tiff, unknown
}
if let data = someData {
switch data.format() {
case .jpg, .png, .gif:
print ("Formats supported by Swift. Yihaaa")
case .tiff:
print ("Do some fancy decoding")
case .pdf:
print ("Read as a file")
case .unknown:
print ("Treat this data differently")
}
}
如果您使用 a 進行比較String
,請確保使用 解碼. isoLatin1
。如果您使用 中的鍵比較位元組mimeTypeSignatures
,則無需。我個人認為使用字串更具可讀性。它有助于解碼和添加測驗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516583.html
標籤:IOS迅速