繁体   English   中英

C - 将三个 8 位字符处理成 24 位块变成四个 6 位块

[英]C - Manipulating three 8-bit chars into 24-bit chunk into four 6-bit chunks

给定三个字符输入 a、b、c,如何将这三个 8 位值转换为一个 24 位值。 接下来,如何将 24 位值转换为四个单独的 6 位值。

例如:

a = ascii 'A' = 0x41 = 0100 0001

b = ascii 'B' = 0x42 = 0100 0010

c = ascii 'C' = 0x43 = 0100 0011

allTogether = 010000010100001001000011

六位1 = 010000

六位2 = 010100

六位3 = 001001

六位4 = 000011

现在对于实现,我正在考虑将 allTogether 设为 int,因为它可以容纳 32 位,然后将包含 'A'、'B' 和 'C' 的字符移到 int 上,但我不确定有多少左移。 至于获得四个六位值,我不知道该怎么做,也不知道应该使用什么数据类型。 任何帮助表示赞赏!

实现将类似于以下内容

unsigned int a = 'A'; // = 0x41 = 0100 0001

unsigned int b = 'B'; // = 0x42 = 0100 0010

unsigned int c = 'C'; // = 0x43 = 0100 0011

unsigned int allTogether = 0 // 010000010100001001000011

unsigned int sixBit1 = 0; // 010000
unsigned int sixBit2 = 0; // 010100
unsigned int sixBit3 = 0; // 001001
unsigned int sixBit4 = 0; // 000011

allTogether = (a<<16)||(b<<8)||c;

sizbit1 = (allTogether&0x00FC0000)>>18;
sizbit2 = (allTogether&0x0003F000)>>12;
sizbit3 = (allTogether&0x00000FC0)>>6;
sizbit4 = (allTogether&0x0000003F);

尝试这个:

#include <stdint.h>

int main (int argc, char const *argv[])
{
    char c1, c2, c3;

    c1 = 'A';
    c2 = 'B';
    c3 = 'C';

    uint32_t allTogether = c1 << 16 | c2 << 8 | c3;
    uint32_t sixBit1 = (allTogether & (0b111111 << 18)) >> 18;
    uint32_t sixBit2 = (allTogether & (0b111111 << 12)) >> 12;
    uint32_t sixBit3 = (allTogether & (0b111111 << 6)) >> 6;
    uint32_t sixBit4 = (allTogether & 0b111111);
    return 0;
}

请注意, 0b111111是 GCC 和 LLVM 以及其他一些但不是所有编译器都支持的二进制文字。 如果您的编译器不支持它,请替换为127

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM