C ++ Байт, sprintf, шестнадцатеричный. Преобразовать байт в двоичный - PullRequest
0 голосов
/ 05 мая 2020

Я работаю над этим проектом, который имеет этот формат / команду. Моя проблема с b0, b1..b5. Я не очень хорошо разбираюсь в C ++. Я могу сделать это в c#.

Configure Image Data (CID) Command
Esc*v6W b0 b1 b2 b3 b4 b5
Where:
• 6 = the number of bytes following the command
• b0 = byte 0 = the color space
• b1 = byte 1 = the Pixel Encoding mode
• b2 = byte 2 = the number of bits per index or palette size
• b3 = byte 3 = the number of bits in the color component
• b4 = byte 4 = the number of bits in the color component
• b5 = byte 5 = the number of bits in the color component
Bytes 0 through 5 must contain binary data, not ASCII.

Как мне это сделать в c ++. Это то, что у меня есть.

int srcBitsPerPixel = 24;
    BYTE bitsPerIndex = 0x00;
    std::string str;
    std::vector<unsigned char> seq(6);
    char bufv6[6];
    StringCchPrintfA(bufv6, 6, "%c%s", 27, "*v6W"); // 5 chars
    MoveMemory(pOemPDEV->pBufStart + dwOffset, bufv6, 6);
    dwOffset += 5;

    seq[0] = (BYTE)0x02; // 0: ColourSpace
    seq[1] = (BYTE)0x03; // 1: Pixel Encoding Mode
    seq[2] = (BYTE)0x00; // 2: Bits Per Index
    seq[3] = (BYTE)0x08; // 3: Bits Per Component
    seq[4] = (BYTE)0x08; // 4: Bits Per Component
    seq[5] = (BYTE)0x08; // 5: Bits Per Component   

    for (int i = 0; i < 6; i++)
    {
        char bufV6W[4];

        StringCchPrintfA(bufV6W, 4, "%02X", seq[i]);
        str.append(bufV6W);
    }

    char v6[50];
    StringCchPrintfA(v6,50, "%c%s",27, str);
    MoveMemory(pOemPDEV->pBufStart + dwOffset, v6, 50);
    dwOffset += 1;

Но я не получаю правильных результатов. Может ли кто-нибудь дать несколько предложений. Это HP PCL на C ++. Я согласен, что этот способ работы может быть очень старым, это не стандарты C ++.

Вот как это выглядит в редакторе HxD enter image description here

1 Ответ

1 голос
/ 05 мая 2020

Судя по используемым там функциям, вам, вероятно, нужно построить и вывести эту последовательность в поток (но в следующий раз вам действительно стоит попытаться объяснить лучше), поэтому попробуйте следующее:

std::vector<unsigned char> v = { '*', 'v', '6', 'W',
                                0x02,   // b0: ColourSpace
                                0x00,   // b1
                                0x08,   // b2
                                0x08,   // b3
                                0x08,   // b4
                                0x08 }; // b5

std::copy(v.begin(), v.end(), pOemPDEV->pBufStart + dwOffset);
...