我正在编写一个函数,将ascii字符串转换为big endian中的二进制表示。
这是我的代码:
int count = 0;
for (int i = 0; i < num_strs; i++) {
for (int j = 0; j < 5; j++) {
char c = sep_str[i][j];
for (int k = 7; k >= 0; k--) {
putchar((c & (1 << k)) ? '1' : '0');
count++;
}
if (count == 32) {
putchar('\n');
count = 0;
}
}
}
我试图将每个字符填充到32位。例如,空格为0x20
- &gt; 1000000
。我希望将其写为00000000000000000000000001000000
并将每个32位二进制数写在一个单独的行上。我的代码会改变什么?
我尝试将for k
外观更改为从32开始,但显然不起作用......
答案 0 :(得分:0)
printf("0000000000000000000000000"); // 25 zeros, leaving 7 bits for ASCII
for (int k = 6; k >= 0; k--) {
putchar((c & (1 << k)) ? '1' : '0');
}
putchar('\n');
答案 1 :(得分:0)
您所要做的就是在每个字节前添加24 0。一种方法是实际遍历所有32位,但只检查最后8位的1:
for (int i = 0; i < num_strs; i++) {
for (int j = 0; j < 5; j++) {
char c = sep_str[i][j];
for (int k = 31; k >= 0; k--) {
putchar((k <= 7 && c & (1 << k)) ? '1' : '0');
}
putchar('\n');
}
}
答案 2 :(得分:0)
假设如下:
sep_str
是一个以空字符结尾的字符串数组..然后你可以看看以下内容。如果这些假设中的任何一个是错误的,那么有很多评论,您应该可以根据需要进行修改。
for (int i = 0; i < num_strs; i++) { /* for each string... */
int len = strlen(sep_str[i]); /* get length */
int n = len % 4; /* (4 - n) = # of bytes of padding */
switch (n) { /* print leading padding */
case 1: fputs("00000000",stdout); /* because of case fall-through, we print */
case 2: fputs("00000000",stdout); /* 8 '0's up to 3 times, depending on the */
case 3: fputs("00000000",stdout); /* amount of padding needed */
}
for (int j = 0; j < len; j++) { /* For each char up to len... */
for (int k = 0x80; k; k >>=1) { /* For each bit (k has the tested bit set) */
/* print 1 if bit set in char, or 0 */
putchar(((unsigned char)(sep_str[i][j]) & k) ? '1' : '0');
}
if (!(++n % 4)) /* If multiple of 4 bytes written... */
putchar('\n'); /* ..add a linefeed */
}
}