2012-08-10 66 views
1

我正在寫一個Flac解碼器,所以我必須讀取flac-header中編碼的2個UTF8值。 這是在文檔中:C#讀取UTF8 UInt64

if(variable blocksize) 
    <8-56>:"UTF-8" coded sample number (decoded number is 36 bits) 
else 
    <8-48>:"UTF-8" coded frame number (decoded number is 31 bits) 

他們在更大的UTF8(可變塊大小)的bitreader文件Bitreader(行1327)用自制的功能。

我看了一下,它不是非常好的代碼來轉換成C#。所以我想過使用帶有UTF8編碼的binaryreader並用這種方法讀取:ReadUint64。 這可能是有效的嗎?這是否是相同的結果?什麼是絕對最快的解決方案?

回答

0

不,這是行不通的。 ReadUInt64只會讀取8個字節;編碼僅用於讀取實際文本 - 即ReadCharReadChars - 而那些將不起作用,因爲char類型只有16位,並且無論如何都不會期望36位值。

當他們在文檔中編寫「UTF8編碼」時,這並不意味着它是真正的UTF-8 - 它只是表示它們使用與UTF-8使用的相同原則編碼一個數字(它們是畢竟,也只是數字,但具有更復雜的限制)。

如果你看看Wikipedia,你會看到他們已經精確地列出了UTF-8字符的編碼方式,最多31位。對於一個36位值繼續這個序列非常簡單 - 在這種情況下,第一個字節將是11111110二進制 - 這就是你應該爲樣本數量做的事情。

雖然你可能不認爲代碼是好的,但它是最明智的方法 - 無論如何,由於UTF-8的工作方式,你不會避免位操作 - 儘管它當然可行爲了對這個確切的代碼做一些變化,基本結構不太可能有很大的不同。