如何将 16 位无符号 int 转换为 8 位无符号字符并最终返回无符号字符*?

How to convert 16 bit unsigned int to 8 bit unsigned char & finally return in an unsigned char*?

本文关键字:无符号 字符 返回 int 转换      更新时间:2023-10-16

我有一个 8 位 unsigned char s 的向量和一个 16 位 unsigned short s 的向量

std::vector<unsigned char> eight_bit_array;
std::vector<unsigned short> sixteen_bit_array;
sixteen_bit_array.resize(x_number_of_samples);
eight_bit_array.resize((x_number_of_samples)*2);

我已经将一些数据填充到sixteen_bit_array中。这很酷。我想知道是否可以将sixteen_bit_array键入和存储到eight_bit_array和如何?

我有一个方法,它通过返回指向unsigned char的指针来返回eight_bit_array,如下所示:

// A legacy method which returns the char array
unsigned char *GetDataSample(std::size_t sample_number) {
    return &eight_bit_array[sample_number];
}

因此,我想将sixteen_bit_array键入并存储到eight_bit_array中,以便我可以返回16 bit unsigned ints,而不必将旧方法的返回类型从 unsigned char * 更改为unsigned short *

请建议如何做到这一点。

你可以

做一些memcpy魔法,但你需要确保你的类型分别是 8 位和 16 位:

#include <cstdint>
#include <vector>
#include <cstring>
int main() {
    std::vector<uint16_t> uint16vals{11, 1, 0, 3};
    std::vector<uint8_t> uint8vals(uint16vals.size() * 2);
    std::memcpy(&uint8vals[0], &uint16vals[0], sizeof(uint16_t) * uint16vals.size());
}

您可以使用按位运算:

std::pair<unsigned char, unsigned char> split(unsigned short n) {
    // set to 0 the bit outside of a 8bit unsigned int
    unsigned char low = n & (1 << 8);
    // get the bit higher than 2^8
    unsigned char high = n >> 8;
    return {high, low};
}

(班次值应该很好,但TBH我不是100%确定(

顺便说一句,当您假设类型的大小时,请使用固定大小类型而不是依赖于实现的大小类型

编辑

要合并两个 8 位整数,您可以执行以下操作:

unsigned short split(unsigned char h, unsigned char l) {
    return (h << 8) + l;
}