反序列化bit高字节开始

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

// 定义描述反序列化信息的结构体
typedef struct {
    const uint32_t *data;   // 数据数组
    int num_elements;       // 数据数组的元素数量
    int bit_position;       // 当前位偏移量(以位为单位)
} DeserializationContext;

// 从指定的反序列化上下文中按位反序列化指定长度的无符号8位整数,并返回结果
uint8_t deserialize_uint8(DeserializationContext *ctx, int num_bits) {
    uint8_t result = 0;
    int remaining_bits = num_bits;

    while (remaining_bits > 0) {
        // 当前位置所在的数组元素索引
        int current_word = ctx->bit_position / 32;
        // 当前位置在数组元素中的位偏移
        int start_bit_in_word = ctx->bit_position % 32;
        // 计算从当前位置到数组元素末尾的可用位数
        int available_bits_in_word = 32 - start_bit_in_word;

        // 需要从当前数组元素中提取的位数
        int bits_to_copy = (remaining_bits < available_bits_in_word) ? remaining_bits : available_bits_in_word;

        // 从当前数组元素中提取指定位数的数据,并合并到结果中
        uint32_t word = ctx->data[current_word];
        uint32_t extracted_bits = (word >> (available_bits_in_word - bits_to_copy)) & ((1 << bits_to_copy) - 1);
        result |= (uint8_t)(extracted_bits << (remaining_bits - bits_to_copy));

        // 更新剩余需要提取的位数和当前位偏移量
        remaining_bits -= bits_to_copy;
        ctx->bit_position += bits_to_copy;

        // 如果当前数组元素的位偏移量达到了32位,则移动到下一个数组元素
        if (ctx->bit_position % 32 == 0 && ctx->bit_position < num_bits) {
            ctx->bit_position++; // 跳过数组元素之间的间隙
        }
    }

    return result;
}

// 从指定的反序列化上下文中按位反序列化指定长度的有符号8位整数,并返回结果
int8_t deserialize_int8(DeserializationContext *ctx, int num_bits) {
    // 反序列化无符号8位整数
    uint8_t unsigned_value = deserialize_uint8(ctx, num_bits);

    // 对有符号整数进行符号扩展
    int8_t signed_value;
    if (unsigned_value & (1 << (num_bits - 1))) {
        // 负数的补码表示,进行符号扩展
        signed_value = (int8_t)(unsigned_value | (~((1 << num_bits) - 1)));
    } else {
        // 正数或零的补码表示
        signed_value = (int8_t)unsigned_value;
    }

    return signed_value;
}

// 从指定的反序列化上下文中按位反序列化指定长度的无符号16位整数,并返回结果
uint16_t deserialize_uint16(DeserializationContext *ctx, int num_bits) {
    uint16_t result = 0;
    int remaining_bits = num_bits;

    while (remaining_bits > 0) {
        // 实现方法类似,直接调用 deserialize_uint8 函数
        result |= (uint16_t)deserialize_uint8(ctx, remaining_bits) << (num_bits - remaining_bits);
        remaining_bits -= 8; // 每次处理8位
    }

    return result;
}

// 从指定的反序列化上下文中按位反序列化指定长度的有符号16位整数,并返回结果
int16_t deserialize_int16(DeserializationContext *ctx, int num_bits) {
    // 实现方法类似,直接调用 deserialize_int8 函数
    return (int16_t)deserialize_int8(ctx, num_bits);
}

// 从指定的反序列化上下文中按位反序列化指定长度的无符号32位整数,并返回结果
uint32_t deserialize_uint32(DeserializationContext *ctx, int num_bits) {
    uint32_t result = 0;
    int remaining_bits = num_bits;

    while (remaining_bits > 0) {
        // 实现方法类似,直接调用 deserialize_uint8 函数
        result |= (uint32_t)deserialize_uint8(ctx, remaining_bits) << (num_bits - remaining_bits);
        remaining_bits -= 8; // 每次处理8位
    }

    return result;
}

// 从指定的反序列化上下文中按位反序列化指定长度的有符号32位整数,并返回结果
int32_t deserialize_int32(DeserializationContext *ctx, int num_bits) {
    // 实现方法类似,直接调用 deserialize_int8 函数
    return (int32_t)deserialize_int8(ctx, num_bits);
}

// 从指定的反序列化上下文中按位反序列化指定长度的无符号64位整数,并返回结果
uint64_t deserialize_uint64(DeserializationContext *ctx, int num_bits) {
    uint64_t result = 0;
    int remaining_bits = num_bits;

    while (remaining_bits > 0) {
        // 实现方法类似,直接调用 deserialize_uint8 函数
        result |= (uint64_t)deserialize_uint8(ctx, remaining_bits) << (num_bits - remaining_bits);
        remaining_bits -= 8; // 每次处理8位
    }

    return result;
}

// 从指定的反序列化上下文中按位反序列化指定长度的有符号64位整数,并返回结果
int64_t deserialize_int64(DeserializationContext *ctx, int num_bits) {
    // 实现方法类似,直接调用 deserialize_int8 函数
    return (int64_t)deserialize_int8(ctx, num_bits);
}


int main() {
    // 示例 uint32_t 数组(假设包含待反序列化的数据)
    const uint32_t data[] = {0x12345678};  // 假设数据数组

    // 创建
    DeserializationContext ctx = {
        .data = data,
        .num_elements = sizeof(data) / sizeof(data[0]),
        .bit_position = 0        
    };
    printf("%d\r\n", deserialize_uint8(&ctx, 3));
    printf("%d\r\n", deserialize_uint8(&ctx, 7));
    printf("%d\r\n", deserialize_uint16(&ctx, 15));
    printf("%d\r\n", deserialize_uint8(&ctx, 7));
    return 0;
}
  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 MAX9296A 初始化序列的示例代码,使用的是 I2C 接口进行通信: ``` // 初始化 MAX9296A 寄存器 void init_max9296a() { // 设置输出模式为 YUV422 write_i2c_reg(MAX9296A_I2C_ADDR, MAX9296A_OUTPUT_FORMAT_REG, 0x02); // 设置内部时钟为 100 MHz write_i2c_reg(MAX9296A_I2C_ADDR, MAX9296A_INTERNAL_CLK_REG, 0x64); // 启用 CSI-2 输出 write_i2c_reg(MAX9296A_I2C_ADDR, MAX9296A_CSI_ENABLE_REG, 0x01); // 设置 CSI-2 数据类型为 RAW12 write_i2c_reg(MAX9296A_I2C_ADDR, MAX9296A_CSI_DATA_TYPE_REG, 0x03); // 设置 CSI-2 数据输出格式为 RAW12 write_i2c_reg(MAX9296A_I2C_ADDR, MAX9296A_CSI_DATA_FORMAT_REG, 0x00); // 启用 CSI-2 校验和 write_i2c_reg(MAX9296A_I2C_ADDR, MAX9296A_CSI_CHECKSUM_ENABLE_REG, 0x01); // 设置 CSI-2 输出数据的字节顺序为 MSB write_i2c_reg(MAX9296A_I2C_ADDR, MAX9296A_CSI_BYTE_ORDER_REG, 0x00); // 设置 CSI-2 输出数据的位顺序为 MSB write_i2c_reg(MAX9296A_I2C_ADDR, MAX9296A_CSI_BIT_ORDER_REG, 0x00); // 设置 CSI-2 输出时钟模式为连续模式 write_i2c_reg(MAX9296A_I2C_ADDR, MAX9296A_CSI_CLK_MODE_REG, 0x00); // 设置 CSI-2 输出时钟频率为 500 MHz write_i2c_reg(MAX9296A_I2C_ADDR, MAX9296A_CSI_CLK_FREQ_REG, 0x00); // 启用 CSI-2 端口 write_i2c_reg(MAX9296A_I2C_ADDR, MAX9296A_CSI_PORT_ENABLE_REG, 0x01); } ``` 请注意,这只是一个示例代码,具体的初始化序列可能会因应用的具体情况而有所不同。在实际使用中,您需要根据您的应用需求来修改初始化序列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值