0

詳細なモニター情報を取得するために、SetupAPI 呼び出しから EDID ブロック (バイト単位) を収集しています。

EDIDのドキュメントにあるように、一部のバイトには「5 ビット文字」が格納されています。

頭痛の種からあなたを救うために、簡単に理解できるスキームを添付します。

ビット内の 3 文字を表す 2 バイト

ご覧のとおり、バイトから 5 ビットの文字を抽出する必要があります。

バイトを BitArray に分割することはできましたが、それらのビットを文字に変換する方法がわかりません。

ウィキにも次のように書かれています。

"00001=A”; “00010=B”; ... “11010=Z”.

さて、これらのビットを変換するための最も速くて最も簡単な方法は何ですか?

次のような Dictionary オブジェクトを事前定義できると思います。

Dictionary<BitArray, char> letters = new Dictionary<BitArray, char>();
letters.Add(new BitArray(new int[] { 0, 0, 0, 1 }),  Convert.ToChar("A"));
letters.Add(new BitArray(new int[] { 0, 0, 1, 0 }),  Convert.ToChar("B"));

それを検索しますが、最初に「00010=B」の後に「11010=Z」をたどる方法がわかりません。次に、もっと適切な方法があるに違いないと確信しています。

ご協力いただきありがとうございます。

4

3 に答える 3

1

この質問に答えるには、C# でのビット操作と、リトル エンディアン マシンでのビットとバイトのレイアウトを理解する必要があります。バイトのビット 0 は符号ビットではなく、最下位の奇数/偶数ビットです。16 ビット量と考えたい場合、2 番目のバイトはビット 15 (符号) からビット 8 であり、その中で最下位です。バイト。しかし、もっと重要なのは、目前の問題です。

上の素敵な写真では、ビット番号が間違っています。これはスペックからもわかります。例: 「2 番目の文字 (文字) は、ビット 1 & 0 (アドレス 08h) とビット 7 → 5 (アドレス 09h) にあります」。修正された図は次のとおりです: ここに画像の説明を入力してください

作業コードは次のとおりです(はい、私は自分のソフトウェアでこれを正確に使用しています):

// in 2 bytes, [8,9], ignore top bit then three 5 bit characters
char[] convert = " ABCDEFGHIJKLMNOPQRSTUVWXYZ01234".ToCharArray();
result.AppendFormat("-8: Vendor ID#: {0}{1}{2}\n",
convert[(edid[8] >> 2) & 0x1F],
convert[((edid[8] << 3) & 0x18) | ((edid[9] >> 5) & 0x07)],
convert[edid[9] & 0x1F]);

私の残りの質問は、上記の文字列の「01234」は何ですか? 「01234」はプレースホルダーとしてのみ使用しました。それらは未定義の特殊文字 ($_-@#) ですか?

于 2015-10-26T19:28:35.980 に答える
0

5 ビットのグループを抽出するには、標準の「ビットストリームから要素を抽出する」手法を使用できます (より一般的ですが、それで問題ありません)。その 1 つのバージョンは次のようになります。低レベルの疑似コードのように)

uint buffer = 0;
int emptybits = 32;
while (want_more_symbols) {
    while (emptybits >= 8 && can_read_more) {
        emptybits -= 8;
        buffer = buffer | ((uint)readByte() << emptybits)
    }
    int symbol = (int)(buffer >> (32 - 5));
    buffer <<= 5;
    emptybits += 5;
    use(symbol);
}

一般に、5 の代わりに 25 までの任意のものを配置でき、可変にすることができます。

または、より具体的には、この場合、配列を調べて直接抽出する必要がある場所を計算できます: (テストされていません)

// extract symbol n
int bitindex = n * 5;
int arrayindex = bitindex / 8;
int leftover = bitindex & 7;
if (leftover <= 3)
    // it's in one byte
    return (array[arrayindex] >> (3 - leftover)) & 32;
else
    // crosses byte boundary
    return ((array[arrayindex] << (leftover - 3)) | 
            (array[arrayindex + 1] >> (11 - leftover))) & 32;

5 ビット値を文字に変換するには、それを「A」に追加します。しかし、それらは A=1 から始まるので、1 を引きます。

char letter = (char)('A' + x - 1);
于 2015-09-19T15:05:17.547 に答える