如何将 16 位 unsigned int 转换为 8 位 unsigned char & 最后 return in unsigned char*?
How to convert 16 bit unsigned int to 8 bit unsigned char & finally return in an 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
。这很酷。 我想知道是否可以将 sixteen_bit_array
& 类型转换并存储到 eight_bit_array
& 如何?
我有一个方法 return 通过 return 指向 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
中,这样我就可以 return 16 bit unsigned ints
而不必更改 return 类型我的传统方法从 unsigned char *
到 unsigned short *
请建议如何操作。
您可以使用位运算:
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};
}
(偏移值应该不错,但我不是 100% 确定)
顺便说一句,当你对类型的大小时做出假设时,使用固定大小的类型而不是依赖于实现的大小类型
编辑
要合并两个 8 位整数,您可以这样做:
unsigned short split(unsigned char h, unsigned char l) {
return (h << 8) + l;
}
你可以做一些 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());
}
我有一个 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
& 如何?
我有一个方法 return 通过 return 指向 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
中,这样我就可以 return 16 bit unsigned ints
而不必更改 return 类型我的传统方法从 unsigned char *
到 unsigned short *
请建议如何操作。
您可以使用位运算:
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};
}
(偏移值应该不错,但我不是 100% 确定)
顺便说一句,当你对类型的大小时做出假设时,使用固定大小的类型而不是依赖于实现的大小类型
编辑
要合并两个 8 位整数,您可以这样做:
unsigned short split(unsigned char h, unsigned char l) {
return (h << 8) + l;
}
你可以做一些 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());
}