gpt4 book ai didi

c++ - 如何在实际二进制位前面附加十六进制字节

转载 作者:行者123 更新时间:2023-11-28 03:02:11 24 4
gpt4 key购买 nike

我在 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()”调用的“发送”函数如下:

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

最佳答案

与其将指向 32 位变量的指针转换为 char *,为什么不直接将其组装为 char 开始?

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

如果您真的需要将一个 32 整数的 1 和 0 数组转换为剩余的四个字节,下面的循环会更简洁:

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);

关于c++ - 如何在实际二进制位前面附加十六进制字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20486956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com