C语言中的字符串编码

hmae6n7t  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(136)

我是新来的,我想做一个程序,把整个句子转换成二进制代码。我有一个主

int main(){
char* text = "Hello, how are you?";
const int len = strlen(text);
bool bytes1[len+1][8];
encode_string(text, bytes1);
for(int j = 0; j <= len; j++){
printf("%c: ", text[j]);
for(int i = 0; i < 8; i++){
    printf("%d", bytes1[j][i]);
}
printf("\n");
}
}

函数void encode_string(const char string[], bool bytes[strlen(string)+1][8])
我写了代码,但它给了我一些不清楚的东西。

#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <stdbool.h>

void encode_string(const char string[], bool bytes[strlen(string)+1][8]){
int len = strlen(string);
for(int t = len; t <= 0; t--){
    printf("%c: ", string[t]);
    for(int q = 0; q <= 7; q++){
        printf("%d", (q << string[t]) & 1 ? 1 : 0);
    }
    printf("\n");
}
}

这就是我得到的:

H: 192900192900
e: 192900192900
l: 192900192900
l: 192900192900
o: 192900192900
,: 192900192900
 : 192900192900
h: 192900192900
o: 00000000
w: 010064000
 : 000064000
a: 02000400
r: 00000000
e: 00000000
 : 00000000
y: 00000000
o: 00000000
u: 00000000
?: 00000000
 : 164342082441228500

但我不知道为什么
(bytes1 =字节,因为我们正在将其放入encode_string函数)

cidc1ykv

cidc1ykv1#

幸运的是,C语言中的所有变量(包括文本)都已经是二进制形式,所以不需要进行任何转换。我们所要做的就是以任何便于读者阅读的形式显示二进制文件。
例如:

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

int main (void)
{
  const char* text = "Hello, how are you?";
  size_t length = strlen(text);
  
  for(size_t i=0; i<length; i++)
  {
    for(size_t bit=0; bit<CHAR_BIT; bit++)
    {
      unsigned int bitmask = 1u << (CHAR_BIT-bit-1) ;
      printf("%u", (text[i] & bitmask) > 0);
    }
    printf(" = '%c'\n", text[i]);
  }
}

说明:

  • CHAR_BIT是写8的学究式方法,因为一些罕见的和外来的系统不一定需要具有8位字节。
  • 内部循环从位0到7计数。但是,当打印二进制时,我们实际上希望从MSB开始。因此,补偿移位CHAR_BIT-bit以屏蔽从MSB开始的位。并且使用CHAR_BIT-bit-1进行补偿,因为我们希望将位7屏蔽为0,而不是8屏蔽为1。
  • text[i] & bitmask如果该位被设置,则给出零或非零值。要将其转换为布尔形式,或者更确切地说是值为1或0的整数,将结果与> 0进行比较,得到1或0。

输出量:

01001000 = 'H'
01100101 = 'e'
01101100 = 'l'
01101100 = 'l'
01101111 = 'o'
00101100 = ','
00100000 = ' '
01101000 = 'h'
01101111 = 'o'
01110111 = 'w'
00100000 = ' '
01100001 = 'a'
01110010 = 'r'
01100101 = 'e'
00100000 = ' '
01111001 = 'y'
01101111 = 'o'
01110101 = 'u'
00111111 = '?'

相关问题