将特定的位写入二进制标头

时间:2018-11-08 10:28:25

标签: c

假设我想创建一个特定长度的二进制文件,使用前4位定义类型(应允许16种不同类型),最后60位定义内容。

人们将如何继续用C进行构建?我很难找到在C中执行此操作的任何示例(正确解释了这一点)(我以前从未在这个低级别上与C一起工作过,我正试图弄湿自己……)

我是否要创建一个char[8]并用类似的方式手动设置每个位

/** Set bit in any sized bit block.
 *
 * @return   none
 *
 * @param   bit    - Bit number.
 * @param   bitmap - Pointer to bitmap.
 *
 * @note    Please note that this function does not know the size of the
 *          bitmap and it cannot range check the specified bit number.
 */
void SetBit(int bit, unsigned char *bitmap)
{
    int n, x;

    x = bit / 8;                        // Index to byte.
    n = bit % 8;                        // Specific bit in byte.

    bitmap[x] |= (1 << n);      // Set bit.
}

以上代码来自storing a bit in a bit of character array in C linux

2 个答案:

答案 0 :(得分:1)

您可以使用类似该功能的东西来帮助您设置特定的半字节(半字节是4位数据.1字节(8位)是2个半字节,这可能会让您感到困惑)。这意味着您只需要通过您的char [x]字节,指定您需要更改字节的左侧还是右侧部分:

int set_nibble(unsigned char* dest,unsigned char src,nibble_side side)
{
    if (side == left_hand )
    {
        *dest = ((*dest & 0x0f) | (src<<4));
        return 0;
    }
    if (side == right_hand )
    {

        *dest = ((*dest & 0xf0) | (src));
        return 0;
    }
    return -1;
}

nibble_side参数类似于

typedef enum nibble_side_t
    {
        right_hand, left_hand
    } nibble_side;

Herehere两个关于二进制AND操作的不错的指南。在执行这样的操作之前,必须习惯使用它过滤所需的数据。

答案 1 :(得分:1)

我将创建特定于任务的功能,仅使用蒙版即可。

torch.FloatTensor([1,0,0,0,1,0])

我将创建一个类似的函数来设置标题的每个字段。

以上假设“头四位”是指标头的第一个字节的最高有效位,而不是标头的第一个字节的最低有效位。