商用密码标准实现

完成下面任务(29分)
1 在 Ubuntu 或 openEuler 中完成任务(推荐openEuler)
2 简述 GM/T0009 4种数据转换的功能,根据你的理解,每种转换功能给出至少一个例子 (8分)
3 参考课程代码sdfproject,基于一个模块utils.c,utils.h使用四个函数分别实现4种数据转换的功能(12分)
4 src中在testsdf.c中编写main函数 测试四个转换功能。 (6分)
5 提交git log结果(3分)

数据转换

  1. 字节串转换为整数
  • 将字节串形式的数据按照一定的规则转换为整数。这个过程涉及字节顺序(大端序或小端序)和整数表示范围等因素。字节顺序决定了字节串中的字节是从高位字节开始还是从低位字节开始构成整数。
  • 示例:假设有一个字节串01 00 00 00(这里以十六进制表示),如果按照大端序转换为整数,那么这个字节串表示的整数是 1。因为在大端序中,高位字节在前,这个字节串的最高字节01表示整数的高位部分,其余字节为 0,所以构成的整数为 1。
  1. 整数转换为字节串
  • 和字节串转换为整数相反,它是将一个给定的整数按照指定的字节顺序转换为字节串形式。在转换过程中,需要考虑整数的大小和字节长度,确保能够完整、准确地表示整数。
  • 示例:将整数 10 转换为字节串(假设按照小端序,每个字节 8 位)。10 的二进制表示为1010,因为 1 个字节(8 位)足够表示 10,所以转换后的字节串为0A 00 00 00(十六进制,高位字节补 0)。
  1. 比特串转换为字节串
  • 比特串是由二进制位(0 或 1)组成的序列,将比特串转换为字节串是将这些二进制位按照每 8 位一组进行划分,然后转换为字节的过程。如果比特串的长度不是 8 的倍数,可能需要进行填充操作。
  • 示例:有一个比特串10101010 11110000,将其转换为字节串。按照每 8 位一组划分,第一组10101010转换为十六进制字节是AA,第二组11110000转换为十六进制字节是F0,所以转换后的字节串为AA F0(十六进制)。
  1. 字节串转换为比特串
  • 将字节串中的每个字节转换为 8 位二进制位序列,然后依次连接起来形成比特串。这是比特串转换为字节串的逆过程。
  • 示例:对于字节串AB(十六进制),A转换为二进制是10101010,B转换为二进制是10111011,所以转换后的比特串是1010101010111011

代码实现

代码

  • utils.h
#ifndef UTILS_H
#define UTILS_H

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

// 字节串转换为整数
uint32_t byteStringToInt(const uint8_t *byte_str, size_t len, int big_endian);

// 整数转换为字节串
void intToByteString(uint32_t num, uint8_t *byte_str, size_t len, int big_endian);

// 比特串转换为字节串
size_t bitStringToByteString(const char *bit_str, size_t bit_len, uint8_t *byte_str);

// 字节串转换为比特串
void byteStringToBitString(const uint8_t *byte_str, size_t byte_len, char *bit_str);

#endif
  • utils.c
#include "utils.h"

// 字节串转换为整数
uint32_t byteStringToInt(const uint8_t *byte_str, size_t len, int big_endian) {
    uint32_t result = 0;
    if (big_endian) {
        for (size_t i = 0; i < len; ++i) {
            result <<= 8;
            result |= byte_str[i];
        }
    } else {
        for (size_t i = len; i > 0; --i) {
            result <<= 8;
            result |= byte_str[i - 1];
        }
    }
    return result;
}

// 整数转换为字节串
void intToByteString(uint32_t num, uint8_t *byte_str, size_t len, int big_endian) {
    for (size_t i = 0; i < len; i++) {
        if (big_endian) {
            byte_str[i] = (num >> ((len - 1 - i) * 8)) & 0xFF;
        } else {
            byte_str[i] = (num >> (i * 8)) & 0xFF;
        }
    }
}

// 比特串转换为字节串
size_t bitStringToByteString(const char *bit_str, size_t bit_len, uint8_t *byte_str) {
    size_t byte_index = 0;
    size_t bit_index = 0;
    while (bit_index < bit_len) {
        uint8_t byte = 0;
        for (size_t i = 0; i < 8 && bit_index < bit_len; ++i) {
            byte <<= 1;
            byte |= (bit_str[bit_index++] == '1')? 1 : 0;
        }
        byte_str[byte_index++] = byte;
    }
    return byte_index;
}

// 字节串转换为比特串
void byteStringToBitString(const uint8_t *byte_str, size_t byte_len, char *bit_str) {
    size_t bit_index = 0;
    for (size_t i = 0; i < byte_len; ++i) {
        for (size_t j = 0; j < 8; ++j) {
            bit_str[bit_index++] = ((byte_str[i] >> (7 - j)) & 1)? '1' : '0';
        }
    }
    bit_str[bit_index] = '\0';
}
  • testsdf.c
#include "utils.h"
#include <string.h>

int main() {
    // 测试字节串转换为整数(大端序示例)
    {
        uint8_t byte_str[] = {0x01, 0x00, 0x00, 0x00};
        size_t len = sizeof(byte_str) / sizeof(byte_str[0]);
        uint32_t num = byteStringToInt(byte_str, len, 1);
        printf("字节串转换为整数(大端序)结果: %u\n", num);
    }

    // 测试整数转换为字节串(小端序示例)
    {
        uint32_t num = 10;
        uint8_t byte_str[4];
        intToByteString(num, byte_str, sizeof(byte_str) / sizeof(byte_str[0]), 0);
        printf("整数转换为字节串(小端序)结果: ");
        for (size_t i = 0; i < sizeof(byte_str) / sizeof(byte_str[0]); ++i) {
            printf("%02X ", byte_str[i]);
        }
        printf("\n");
    }

    // 测试比特串转换为字节串示例
    {
        const char *bit_str = "1010101011110000";
        size_t bit_len = strlen(bit_str);
        uint8_t byte_str[2];
        size_t byte_count = bitStringToByteString(bit_str, bit_len, byte_str);
        printf("比特串转换为字节串结果: ");
        for (size_t i = 0; i < byte_count; ++i) {
            printf("%02X ", byte_str[i]);
        }
        printf("\n");
    }

    // 测试字节串转换为比特串示例
    {
        uint8_t byte_str[] = {0xAB};
        size_t byte_len = sizeof(byte_str) / sizeof(byte_str[0]);
        char bit_str[8 * byte_len + 1];
        byteStringToBitString(byte_str, byte_len, bit_str);
        printf("字节串转换为比特串结果: %s\n", bit_str);
    }

    return 0;
}

在这里插入图片描述
在这里插入图片描述

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐