我正在尝试解析屏幕 EDID 信息。不幸的是,它不是任何常见的编码数据。 您是否知道如何将“IODisplayEDID”中的数据转换为可读的内容?也许是“字典”?
这是我的代码:
var object : io_object_t
var serialPortIterator = io_iterator_t()
let matching = IOServiceMatching("IODisplayConnect")
let kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault,
matching,
&serialPortIterator)
if KERN_SUCCESS == kernResult && serialPortIterator != 0 {
repeat {
object = IOIteratorNext(serialPortIterator)
let info = IODisplayCreateInfoDictionary(object, UInt32(kIODisplayOnlyPreferredName)).takeRetainedValue() as NSDictionary as! [String:AnyObject]
if let displayEDID = info["IODisplayEDID"] as? Data {
print(displayEDID) // <-- How do I parse this data correctly?
}
} while object != 0
}
IOObjectRelease(serialPortIterator)
最佳答案
好吧,基本上我使用了评论中提供的 wiki 引用 Eric Aya。我按照指定的顺序读取8-9个字节,以提取字母表字母的树号。在我的 Mac 上,结果显示为“APP”,我猜这意味着制造商是 Apple。
if let displayEDID = info["IODisplayEDID"] as? Data {
let array = Array(displayEDID)
var bits : UInt16 = UInt16(array[8])
bits = bits << 8 + UInt16(array[9])
let thirdLetterIndex = Int(bits & 31)
let secondLetterIndex = Int(bits >> 5 & 31)
let firsLetterIndex = Int(bits >> 10 & 31)
let chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters.flatMap { $0.description }
let manufactorer = chars[firsLetterIndex - 1] + chars[secondLetterIndex - 1] + chars[thirdLetterIndex - 1]
print(manufactorer) // Result for my mac is "APP"
}
关于swift - 如何读取屏幕EDID数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45100439/