从字符

时间:2016-10-15 21:38:21

标签: c binary character ascii bits

所以我有一个像下列{h,e,l,l,o,o}的字符数组 所以我首先需要将它转换为它的位表示,所以我将拥有这个

h = 01101000
e = 01100101
l = 01101100
l = 01101100
o = 01101111
o = 01101111

我需要将所有这些位分成五个一组并保存到一个数组中 所以例如所有这些字符的联合将是

011010000110010101101100011011000110111101101111

现在我把它分成五组,所以

01101 00001 10010 10110 11000 11011 00011 01111 01101 111

并且最后一个序列应该用零完成,所以它将是00111。注意:每组5位将用标题填写,以便有8位。

所以我还没有意识到如何实现这个目标,因为我可以提取每个字符的5位并以二进制形式获取每个字符的表示

 for (int i = 7; i >= 0; --i)
  {
     printf("%c", (c & (1 << i)) ? '1' : '0');
  }

问题是如何组合两个字符所以如果我有两个字符00000001和11111110当我分为五组时我将有5位字符的第一部分而对于第二组我将有3位来自最后一个字符和第二个字符。如何进行此组合并将所有这些组保存在数组中?

3 个答案:

答案 0 :(得分:1)

假设一个字节由8位组成(注意:C标准不保证这个),你必须遍历字符串并使用位操作来完成它:< / p>

  • >> n右移以摆脱n个最低位
  • << n在最低位置注入n次0位
  • & 0x1f仅保留5个最低位并重置高位
  • 当重叠位为0 时,
  • |合并高位和低位

这可以这样编码:

char s[]="helloo";

unsigned char last=0;          // remaining bits from previous iteration in high output part
size_t j=5;                    // number of high input bits to keep in the low output part 
unsigned char output=0; 
for (char *p=s; *p; p++) {     // iterate on the string 
    do {
        output = ((*p >> (8-j)) | last) & 0x1f;  // last high bits set followed by j bits shifted to lower part; only 5 bits are kept 
        printf ("%02x ",(unsigned)output);
        j += 5;                                  // take next block  
        last = (*p << (j%8)) & 0x1f;             // keep the ignored bits for next iteration 
    } while (j<8);                               // loop if second block to be extracted from current byte
    j -= 8;                                      
}
if (j)                                           // there are trailing bits to be output
   printf("%02x\n",(unsigned)last); 

online demo

您的示例的显示结果将是(十六进制):0d 01 12 16 18 1b 03 0f 0d 1c,它与您列出的每个5位组完全对应。请注意,如果这个代码广告在最后一个块中正确填充,如果它不完全是5位长(例如,这里最后3位填充到11100,即0x1C而不是111,这将是0x0B)

您可以轻松调整此代码以将输出存储在缓冲区中而不是打印它。唯一微妙的事情是预先计算输出的大小,该大小应该是原始大小的8/5倍,如果它不是5的倍数则增加1,如果你期望添加终结符则再增加1。

答案 1 :(得分:1)

以下是一些可以解决问题的代码:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char arr[6] = {'h', 'e', 'l', 'l', 'o', 'o'};
    char charcode[9];
    char binarr[121] = "";
    char fives[24][5] = {{0}};
    int i, j, n, numchars, grouping = 0, numgroups = 0;

    /* Build binary string */
    printf("\nCharacter encodings:\n");
    for (j = 0; j < 6; j++) {
        for (i = 0, n = 7;  i < 8; i++, n--)
            charcode[i] = (arr[j] & (01 << n)) ? '1' : '0';
        charcode[8] = '\0';
        printf("%c = %s\n", arr[j], charcode);
        strcat(binarr, charcode);
    }

    /* Break binary string into groups of 5 characters */
    numchars = strlen(binarr);
    j = 0;
    while (j < numchars) {
        i = 0;
        if ((numchars - j) < 5) {                 // add '0' padding
            for (i = 0; i < (5 - (numchars - j)); i++)
                fives[grouping][i] = '0';
        }
        while (i < 5) {                           // write binary digits
            fives[grouping][i] = binarr[j];
            ++i;
            ++j;
        }
        ++grouping;
        ++numgroups;
    }

    printf("\nConcatenated binary string:\n");
    printf("%s\n", binarr);

    printf("\nGroupings of five, with padded final grouping:\n");
    for (grouping = 0; grouping <= numgroups; grouping++) {
        for (i = 0; i < 5; i++)
            printf("%c", fives[grouping][i]);
        putchar(' ');
    }
    putchar('\n');

    return 0;
}

按原样运行时,输出为:

Character encodings:
h = 01101000
e = 01100101
l = 01101100
l = 01101100
o = 01101111
o = 01101111

Concatenated binary string:
011010000110010101101100011011000110111101101111

Groupings of five, with padded final grouping:
01101 00001 10010 10110 11000 11011 00011 01111 01101 00111  

答案 2 :(得分:1)

Cars sedan;
sedan.x = 20;
sedan.y = 10;