所以我有一个像下列{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位来自最后一个字符和第二个字符。如何进行此组合并将所有这些组保存在数组中?
答案 0 :(得分:1)
假设一个字节由8位组成(注意:C标准不保证这个),你必须遍历字符串并使用位操作来完成它:< / p>
>> n
右移以摆脱n个最低位<< n
在最低位置注入n次0位& 0x1f
仅保留5个最低位并重置高位|
合并高位和低位
这可以这样编码:
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);
您的示例的显示结果将是(十六进制):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;