使用 C 操作位和字节时遇到问题 - 摩尔斯电码

Trouble with manipulating bits and Bytes with C - Morse code

我无法弄清楚如何使用 C 来处理位。想知道是否有人可以为我解决一些问题。

声明:

const  unsigned  char  asciiToMCTable [] = {0x30, 0x31 , 0x32 , 0x33 , 0x34 , 0x35 , 0x36 , 0x37 , 0x38 , 0x39 , 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47 ,0x42 , 0x84 , 0xA4 , 0x83 , 0x01 , 0x24 ,0xC3 , 0x04 , 0x02 , 0x74 , 0xA3 , 0x44 ,0xC2 , 0x82 , 0xE3 , 0x64 , 0xD4 , 0x43 ,0x03 , 0x81 , 0x23 , 0x14 , 0x63 , 0x94 , 0xB4 , 0xC4};

这个函数可以完美地用于字母表(从 A 到 Z),但不能用于数字:

unsigned  char  asciiToMC(unsigned  char  ascii){
        return  asciiToMCTable[ascii  - 48];
}

我认为这些说明有问题:

void  MCSendChar(unsigned  char ch){
    unsigned  char a = asciiToMC(ch);
    unsigned  char n = a & 0x07 , j;

    printf("\n %u \n", n);
    for(j = 0; j < n; j++) {
        if((0x80 & a) != 0)
            MCendDash ();
        else
            MCSendDot ();

        a = a << 1;
        Sleep(10*MC_DOT_TIME);
    }

执行:

unsigned  char  ascii = '4';
    MCSendChar(ascii);
    printf("\n");

print : ..-- ,这是不正确的(应该打印 : ....-)

    ascii = 'G';
    MCSendChar(ascii);
    printf("\n");

打印:--。 , 正确

数字 0 到 9 的 ASCII 值跨越范围 0x30 到 0x39(48 到 57)(含)。 asciiToMC(ascii) returns asciiToMCTable[ascii-48],或等价的 asciiToMCTable[ascii-0x30]。因此,asciiToMCTable[] 的前 10 个元素应包含 ASCII 数字 0 到 9 的 MC 编码。

asciiToMCTable[]中一个ASCII字符的摩尔斯电码编码包括一个长度为n的摩尔斯序列长度n编码在后三位,以及点 (0) 和破折号 (1) 在第 7 位向下编码,第 7 位是传输顺序中的第一个摩尔斯位。

在摩尔斯电码中,数字 0 到 9 的序列长度均为 5,因此前 5 位应包含特定数字的点 (0) 和破折号 (1) 序列,而后 3 位位应包含长度 5.

                  MMMMMnnn
0 = "-----" ==> 0b11111101 = 0xFD
1 = ".----" ==> 0b01111101 = 0x7D
2 = "..---" ==> 0b00111101 = 0x3D
3 = "...--" ==> 0b00011101 = 0x1D
4 = "....-" ==> 0b00001101 = 0x0D
5 = "....." ==> 0b00000101 = 0x05
6 = "-...." ==> 0b10000101 = 0x85
7 = "--..." ==> 0b11000101 = 0xC5
8 = "---.." ==> 0b11100101 = 0xE5
9 = "----." ==> 0b11110101 = 0xF5

(上面的 0b 前缀仅用于说明目的(因为它们是非标准的)来表示二进制常量。)

目前,OP代码中asciiToMCTable[]的前10个元素包含数字的ASCII码,这是不正确的,导致ASCII数字的摩尔斯电码输出不正确。它们需要替换为上面列出的摩尔斯编码。