【问题标题】:how to append hex byte in front of actual binary bits如何在实际二进制位前面附加十六进制字节
【发布时间】:2013-12-27 12:38:03
【问题描述】:

我在 Win32 中以十六进制形式发送实际的二进制位。代码是

int binText[32]={1,0,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,1,1,1,0,1,0,1,1,1,1,1,0,0,0,1}; //hex:  AF 1A F5 F1
char tempInt[255]={0};
for (int i=0; i<32; i++)
{
    sprintf(&tempInt[strlen(tempInt)], "%d", binText[i]);
}
char HexBuffer[255];
unsigned long int Number = 0;
int BinLength = strlen(tempInt);

for(int i=0; i<32; i++)
{
        Number += (long int)((tempInt[32 - i - 1] - 48) * pow((double)2, i));
}

    //When i send using following code it sends F1 F5 1A AF
    //serialObj.send((char *)&Number);
    //So it is changed into big endian using following code.

unsigned char c1, c2, c3, c4;
c1 = Number & 255;
c2 = (Number >> 8) & 255; //>>right shift operator
c3 = (Number >> 16) & 255;
c4 = (Number >> 24) & 255;
unsigned long int Number1= ((int)c1 << 24) + ((int)c2 << 16) + ((int)c3 << 8) + c4;

//and now following code sends AF 1A F5 F1
serialObj.send((char *)&Number1);

现在我必须在 AF 1A F5 F1 前面附加三个十六进制字节 24 24 3F。我们如何将这些十六进制字节附加到 Number1。

“serialObj.send()”调用的“send”函数如下:

void serial::send(char data[])
{
    DWORD dwBytesWrite;
    WriteFile(serialHandle, data, 7, &dwBytesWrite, NULL);
}

【问题讨论】:

    标签: c++ winapi binary serial-port hex


    【解决方案1】:

    与其将指向 32 位变量的指针转换为 char *,不如直接将事物组合为字符开始?

    char buf[7] = { 0x24, 0x24, 0x3F };  // first three bytes are prefix
    

    如果您确实需要将 1 和 0 的 32-int 数组转换为剩余的四个字节,则以下循环会更简洁:

    char buf[7] = { 0x24, 0x24, 0x3F };  // first three bytes are prefix
    
    unsigned char byte = 0;
    for (int i = 0; i < 32; i++)
    {
        byte = (byte << 1) | binText[i];
    
        if ( (i & 7) == 7 )
        {
            buf[ 3 + (i >> 3) ] = byte;  // The "3 +" part adds new bytes past the header
            byte = 0;
        }
    }
    serialObj.send(buf);
    

    但是,如果字符串 AF 1A F5 F1 实际上是固定的,那么您只需要:

    char buf[7] = { 0x24, 0x24, 0x3F, 0xAF, 0x1A, 0xF5, 0xF1 };
    serialObj.send(buf);
    

    【讨论】:

    • 我的 binText[] int 数组不固定。所以我必须使用你的第一个选项。我在 binText[] 中有 80 00 00 00 并使用您的代码 80 00 00 00 00 00 00 发送。它不是在开始时发送 24 24 3F 。你能帮帮我吗?
    • @user3048644 :糟糕,我犯了一个编辑错误。给我几秒钟,我会解决它。
    • 我想我已经在前面添加了。你能解释一下你用按位运算做了什么吗?我试图理解但无法得到清晰的概念。如果您稍微解释一下会很有帮助... :)
    • 代码读取binText[]数组,并逐位组装字节。它从binText[] 中取出每一位并将其插入一个字节的底部,将其他位左移一位。 (这就是(byte &lt;&lt; 1) | binText[i]。每8 位之后,它将字节写入缓冲区,并清除字节。(这就是if ( (i &amp; 7) == 7 ) ... 所做的。)只要binText 是8 位的倍数,它就可以工作。
    猜你喜欢
    • 1970-01-01
    • 2018-08-26
    • 2014-10-30
    • 2015-09-27
    • 2015-07-03
    • 2015-08-08
    • 2012-06-04
    • 2023-03-14
    • 2012-05-30
    相关资源
    最近更新 更多