如何将16位无符号整数转换为8位无符号字符&最后返回一个unsigned char *?

时间:2017-05-17 12:02:53

标签: c++ c++11 stdvector unsigned-integer unsigned-char

我有一个 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。这很酷。 我想知道是否可以进行类型转换&amp;存储sixteen_bit_array&amp;进入eight_bit_array&amp;怎么样?

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

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

所以我想要转发&amp;将sixteen_bit_array存储到eight_bit_array中,这样我就可以返回16 bit unsigned ints,而无需将遗留方法的返回类型从unsigned char *更改为unsigned short *

请建议如何执行此操作。

2 个答案:

答案 0 :(得分:2)

你可以做一些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());
}

答案 1 :(得分:1)

您可以使用按位操作:

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%肯定)

BTW,当您对类型的大小进行假设时,使用固定大小类型而不是依赖于实现的大小类型

修改

要合并两个8位整数,你可以这样做:

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