如何将位数组转换为char

nea 发布于 2019-03-09 byte 最后更新 2019-03-09 14:42 3 浏览

我试图通过根据一些要求修改LSB(最低有效位)来编辑缓冲区的每个字节。 我使用unsigned char类型的字节,所以请让我知道如果这是正确的/错误的。

unsigned char buffer[MAXBUFFER];
接下来,我使用这个功能
char *uchartob(char s[9], unsigned char u)
它修改并返回第一个参数作为位数组。这个函数工作得很好,因为数组中的位代表第二个参数。 这就是麻烦开始的地方。我将指出我想要一步一步做的事情,以便你们可以让我知道我错在哪里。 我将上述函数的结果(称为缓冲区的每个元素)保存在一个变量中
char binary_byte[9];             // array of bits
我正在测试LSB,只是将它与上面的一些标志进行比较。
if (binary_byte[7]==bit_flag)     // i go on and modify it like this
binary_byte[7]=0;                // or 1, depending on the case
接下来,我试图将位数组binary_byte(它是一个位数组,是不是?)转换回字节/无符号字符并同时更新缓冲区中的数据。我希望我能够让自己清楚,因为我现在很困惑。
buffer[position_in_buffer]=binary_byte[0]<<7| // actualize the current BYTE in the buffer
                        binary_byte[1]<<6|
                        binary_byte[2]<<5|
                        binary_byte[3]<<4|
                        binary_byte[4]<<3|
                        binary_byte[5]<<2|
                        binary_byte[6]<<1|
                        binary_byte[7];
请记住位于binary_byte [7]的位可能会被修改,这就是所有这一点。 这个解决方案并不是很高雅,但它仍然有效,即使我对我所做的事情确实感到不安全(我试图用按位运算符来做,但没有成功) 奇怪的是当我试图从缓冲区打印更新的字符。它与前一个字符具有相同的位,但它是完全不同的一个。 enter image description here 我的最后一个问题是:只改变字节中的LSB有什么作用?我应该期待什么?正如你所看到的,即使我不应该,我也只能得到“新”人物。
已邀请:

iaut

赞同来自:

所以我仍然不确定你在这里要完成什么,但是因为你试图修改一个字节的各个位,我建议使用以下数据结构:

union bit_byte
{
    struct{
        unsigned bit0 : 1;
        unsigned bit1 : 1;
        unsigned bit2 : 1;
        unsigned bit3 : 1;
        unsigned bit4 : 1;
        unsigned bit5 : 1;
        unsigned bit6 : 1;
        unsigned bit7 : 1;
    } bits;
unsigned char all;
};
这将允许您访问字节的每个位,仍然可以获得字节表示。这里有一些快速示例代码:
bit_byte myValue;
myValue.bits.bit0 = 1;    // Set the LSB
// Test the LSB
if(myValue.bits.bit0 == 1) {
    myValue.bits.bit7 = 1;
}
printf("%i", myValue.all);

cea

赞同来自:

按位: set bit => a |= 1 << x; reset bit => a &= ~(1 << x); bit check => a & (1 << x); 翻转位=> a ^= (1 << x) 如果您无法管理,则可以始终使用std::bitset。 助手宏: #define SET_BIT(where, bit_number) ((where) |= 1 << (bit_number)) #define RESET_BIT(where, bit_number) ((where) &= ~(1 << (bit_number))) #define FLIP_BIT(where, bit_number) ((where) ^= 1 << (bit_number)) #define GET_BIT_VALUE(where, bit_number) (((where) & (1 << (bit_number))) >> bit_number) //这将重新调整0或1 帮助应用程序打印位:

#include <iostream>
#include <cstdint>
#define GET_BIT_VALUE(where, bit_number) (((where) & (1 << (bit_number))) >> bit_number)
template<typename T>
void print_bits(T const& value)
{
    for(uint8_t bit_count = 0;
        bit_count < (sizeof(T)<<3);
        ++bit_count)
    {
        std::cout << GET_BIT_VALUE(value, bit_count) << std::endl;
    }
}
int main()
{
    unsigned int f = 8;
    print_bits(f);
}