我想在一个位打包的结构中有一个数组.我静态地知道数组的大小(32),我希望数组中的每个元素都是一个位.例如,我希望能够说出类似的话:
struct example_s {
// ...
unsigned int flags[32] : 32;
} __attribute__((__packed__));
Run Code Online (Sandbox Code Playgroud)
我尝试了几件事,但是gcc不会让步.能够这样做是很好的,这样我就可以编写遍历打包数组中元素的干净代码.想法?
我想将一些二进制图像数据编码/压缩为序列(如果是位).(通常,此序列的长度不能完全适合整数个标准整数类型.)
如何在不浪费空间的情况下做到这一点?(我意识到,除非比特序列具有"漂亮"的长度,否则在最后总是必须有少量[<1字节]的剩余空间.)
FWIW,我估计,对于我想要编码的每个符号,最多需要3位.Python有这种工作的内置工具吗?
是否有C#,允许类似的功能Python的库struct从标准库?
可以使用真实对齐的结构非常接近地模拟结构库.但我还没有找到任何方法来直接控制C#结构中的endianess(C#的结构似乎更倾向于COM互操作,而不是更倾向于通用二进制包装).
我有一个字节数组,其中每个字节都是0或1.现在我想将这些值打包成位,这样8个原始字节占用1个目标字节,原始字节0进入位0,字节1进入位1,到目前为止,我在内核中有以下内容:
const uint16_t tid = threadIdx.x;
__shared__ uint8_t packing[cBlockSize];
// ... Computation of the original bytes in packing[tid]
__syncthreads();
if ((tid & 4) == 0)
{
packing[tid] |= packing[tid | 4] << 4;
}
if ((tid & 6) == 0)
{
packing[tid] |= packing[tid | 2] << 2;
}
if ((tid & 7) == 0)
{
pOutput[(tid + blockDim.x*blockIdx.x)>>3] = packing[tid] | (packing[tid | 1] << 1);
}
Run Code Online (Sandbox Code Playgroud)
这是正确有效的吗?
在以下2个结构中,
typedef struct _a {
short a1:13 __attribute__((packed));
char a2[4] __attribute__((packed));
} a;
typedef struct _b {
short b1:10 __attribute__((packed));
short b2:10 __attribute__((packed));
short b3:12 __attribute__((packed));
} b;
Run Code Online (Sandbox Code Playgroud)
在struct b,我发现b2的位用b1打包,b3的位用b2打包.它最终导致4字节值.
我期待类似的行为,struct a但我看不出相同.前2个字节用a1(未使用的5位)占用,后跟4个字节用于a2.
这种行为有望吗?为什么我不能将char [4]与短片一起包装:13?有没有办法实现它?
我需要从原始比特流中提取所有10位单词 ABACABACABAC...
它已经可以与天真的C实现一起使用,例如
for(uint8_t *ptr = in_packet; ptr < max; ptr += 5){
const uint64_t val =
(((uint64_t)(*(ptr + 4))) << 32) |
(((uint64_t)(*(ptr + 3))) << 24) |
(((uint64_t)(*(ptr + 2))) << 16) |
(((uint64_t)(*(ptr + 1))) << 8) |
(((uint64_t)(*(ptr + 0))) << 0) ;
*a_ptr++ = (val >> 0);
*b_ptr++ = (val >> 10);
*a_ptr++ = (val >> 20);
*c_ptr++ = (val >> 30);
}
Run Code Online (Sandbox Code Playgroud)
但是性能对于我的应用程序来说是不够的,因此我想使用一些AVX2优化来改善它。
我访问了网站https://software.intel.com/sites/landingpage/IntrinsicsGuide/#,以找到可以提供帮助的任何功能,但似乎没有任何功能可用于10位字,只有8位或16位字。这似乎是合乎逻辑的,因为10位不是处理器固有的,但对我来说却很难。
有什么方法可以使用AVX2解决此问题?
我很好奇将小数存储为位打包无符号整数与字节向量的性能差异(cpu 和内存使用量)
我将使用存储 RGBA 值的示例。它们是 4 个字节,因此很容易将它们存储为u32.
但是,将它们存储为类型的向量会更具可读性u8。
这就是我将如何去做这两种方法:
// Bitpacked:
let i: u32 = 4278190335;
//binary is 11111111 00000000 00000000 11111111
//In reality I would most likely do something more similar to:
let i: u32 = 255 << 24 + 255; //i think this syntax is right
// Vector:
let v: Vec<u8> = [255,0,0,255];
Run Code Online (Sandbox Code Playgroud)
然后可以查询这两个红色值
i >> 24
//or
&v[0]
//both expressions evaluate to 255 (i think. I'm really new to …Run Code Online (Sandbox Code Playgroud) 我必须为以下数据包头写一个c ++代码:

这是我为上面的数据包格式编写的结构代码.我想知道uint8_t或uint16_t位字段是否正确
struct TelemetryTransferFramePrimaryHeader
{
//-- 6 Ocets Long --//
//-- Master Channel ID (2 octets)--//
uint16_t TransferFrameVersionNumber : 2;
uint16_t SpacecraftID : 10;
uint16_t VirtualChannelID : 3;
uint16_t OCFFlag : 1;
//-----------------//
uint8_t MasterChannelFrameCount;
uint8_t VirtualChannelFrameCount;
//-- Transfer Frame Data Field Status (2 octets) --//
uint16_t TransferFrameSecondaryHeaderFlag : 1;
uint16_t SyncFlag : 1;
uint16_t PacketOrderFlag : 1;
uint16_t SegmentLengthID : 2;
uint16_t FirstHeaderPointer : 11;
//-----------------//
};
Run Code Online (Sandbox Code Playgroud)
如何确保在结构中保留LSB - > MSB?
我一直很困惑,我已经尝试过阅读,但最终让我更加困惑.
PS:我使用的是32位处理器.