c - 在 C 中使用 unsigned char 进行神奇打印

标签 c printing unsigned-char

上学期我选修了一门操作系统类(class)。我对全类都用 C 语言授课并不感到惊讶,但大量使用它似乎让类的一些人感到恼火。当类(class)结束时,一些不喜欢这门语言的人开始大声说他们很高兴不必再用 C 语言编程了。这引发了学生(和老师)之间的一场小辩论,最后以一位教授该类(class)的老师的答复结束。他的回答是用 C 代码写的:

#include <stdio.h>

unsigned char output[] = { 
0xe7, 0x3a, 0x1d, 0x2f, 0x01,
0x92, 0x42, 0x09, 0x48, 0x01,
0x92, 0x32, 0x09, 0x8e, 0x01,
0x92, 0x0a, 0x09, 0x48, 0x01,
0xe7, 0x73, 0xdd, 0x2f, 0x00,
};

int main() {
    unsigned char* wb;
    int i;
    for (wb = output; *wb; wb++) {

        if (*wb == 0x01) {
            printf("\n");
            continue;
        }

        for (i = 7; i >= 0; i--) {
            putchar((((*wb >> i) & 1) + 0x20));
        }
    }
    printf("\n");
    return 0;
}

这打印:

!!!  !!!  !!! !    !!! !  ! !!!!
!  !  !  !    !     !  ! !  !   
!  !  !   !!  !     !  !!   !!! 
!  !  !     ! !     !  ! !  !   
!!!  !!! !!!  !!!! !!! !  ! !!!!

这是我一生中见过有人用 C 代码做过的最酷的事情!!! 任何人都可以向我解释这是如何完成的吗?

[编辑:为了清晰起见调整了缩进]

最佳答案

一个提示,考虑数组输出的二进制表示。这种技术出现的一个地方是控制硬件寄存器中的位,就像您在嵌入式系统中所做的那样——这是 C 真正闪耀的地方。

关于c - 在 C 中使用 unsigned char 进行神奇打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19305379/

相关文章:

c - 如何告诉 Swig 将 'u_char *' 视为 'unsigned char *'

c - 在 C 语言中将 Unix 命令运行到 DOS 等价物

CTRL-C 处理程序无法正常工作

c - 如何使用 JSCH 发送 CTRL+C?

java - 在 Java 中使用二维数组打印带对角线的矩形

c# - PrintTicket 提供程序无法绑定(bind)到打印机。 Win32错误: The printer name is invalid

c++ - 在 C++ 中键入 "char"

c - 在非二进制补码系统上,普通 char 通常/总是未签名吗?

c - 如何为 typedef 结构正确分配内存

printing - Crystal Reports 11 - 如何在多个页面上打印不同的数据