2017-07-14 79 views
1

我想解析屏幕EDID信息。不幸的是,它不是通常的編碼數據。 你碰巧知道如何將'IODisplayEDID'中的數據轉換爲可讀的數據?也許'詞典'?如何閱讀屏幕EDID數據?

這裏是我的代碼:

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) 
+0

這是一個數據結構,它只是字節:https://en.wikipedia.org/wiki/Extended_Display_Identification_Data它是相當複雜的。這是[C程序](https://cgit.freedesktop.org/xorg/app/edid-decode/),它解析了很多東西。這是一個非常複雜的結構。 – Moritz

+1

謝謝,@EricAya在您提供的wiki的幫助下編寫了提取我需要的數據的代碼。 – user2219572

回答

1

好了,所以基本上我用維基參考埃裏克·綾在評論中提供。我按照指定的順序讀取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" 
      }