ASCII和二进制之间的转换器和压缩器

时间:2010-09-20 17:21:49

标签: c binary char ascii cstring

我正在尝试制作一个非常简单的转换器/压缩器;程序应该采用包含4种不同类型ASCII字符的文件,并将其作为二进制文件写入文件。该程序还应读取二进制文件并将其转换为ASCII并在屏幕上打印出来。在我的代码下面,我无法真正获得char / cstring。我必须做些什么样的改进才能让它发挥作用?

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

char compresser(char c);
char converter(char c);

int main(int argc, char **argv)
{
    char *c;
    FILE *If = fopen("A.txt", "r");
    FILE *Uf = fopen("B.txt", "rw");

    if(If == NULL || Uf == NULL) {
            printf("Could not open file");
    }

    if(argc < 4) {
        printf("Too few argument, must be 3\n");

    } else if(strcmp(argv[1], "p") == 0) {
        while((c = fgetc(If)) != EOF) {
            printf("%c", c);
        }

    } else if(strcmp(argv[1], "e") == 0) {
        while((c = fgetc(If)) != EOF) {
            fprintf(Uf, "%c\n", compresser(c));
        }

    } else if(strcmp(argv[1], "d") == 0) {
        while((c = fgetc(Uf)) != EOF) {
            printf("%c", converter(c));
        }

    } else {
        printf("Not a valid command\n");
    }
}

char compresser(char c)
{
        if(c == ' ') {
            return '00';
        } else if(c == ':') {
            return '01';
        } else if(c == '@') {
            return '10';
        } else if(c == '\n') {
            return '11';
        } else {
            return 'e';
        }
}

char converter(char c)
{
        if(c == '00') {
            return ' ';
        } else if(c == '01') {
            return ':';
        } else if(c == '10') {
            return '@';
        } else if(c == '11') {
        return '\n';
    } else {
        return 'e';
    }

}

3 个答案:

答案 0 :(得分:1)

您可能想要解决许多问题。

我注意到的第一件事是您测试错误情况,打印错误消息,然后继续处理,好像一切正​​常。

第二个是压缩算法 不是 压缩算法。就目前而言,您似乎希望每个未压缩的角色都以压缩形式变为两个。即使你想要按照Eli的建议写一个小数值,你也不会减少存储角色所需的空间。

我的猜测是你真正想要的是binary,而不是十进制表示。那将使你用两位而不是一个完整的字节代表每个字符。

例如,给定四个字符“A”,“B”,“C”和“D”,一个可能的二进制表示将是

CHAR    BITS
A   <=>   00
B   <=>   01
C   <=>   10
D   <=>   11

然后您可以选择如何将这些值组合成压缩形式,例如,四个字符序列ABAD可以表示为0001001111000100。只需确保按照与组合方式相对应的方式将它们分开。

要明确00010011等同于小数19

有关如何操作位的详细信息,请查看here

答案 1 :(得分:0)

此代码不正确:

char compresser(char c)
{
        if(c == ' ') {
            return '00';
        } else if(c == ':') {
            return '01';
        } else if(c == '@') {
            return '10';
        } else if(c == '\n') {
            return '11';
        } else {
            return 'e';
        }
}

'00'在C中无效,因为字符文字必须由单个字符组成。 '\x00'表示值为0的字符。使用\x00表示二进制0x00,而不是00

澄清的示例代码:

#include <stdio.h>

int main()
{
    char c = '\x61';

    printf("%c\n", c);

    return 0;
}

了解我如何定义c


然而,我说,我看不出你的方法是如何压缩字符的。

答案 2 :(得分:0)

以下是一个示例代码片段:

unsigned int Compress(char letter_1, char letter_2, char letter3, char letter 4)
{
  unsigned int value = 0;
  unsigned int result = 0;
  value = letter1 - 'A';
  result = result << 2; // Shift the old to make room for new bits.
  result |= value;      // Put in new bits.
  value = letter2 - 'A';
  result = result << 2; // Shift the old to make room for new bits.
  result |= value;      // Put in new bits.
  value = letter3 - 'A';
  result = result << 2; // Shift the old to make room for new bits.
  result |= value;      // Put in new bits.
  value = letter4 - 'A';
  result = result << 2; // Shift the old to make room for new bits.
  result |= value;      // Put in new bits.
  return result;
}

这是压缩字母(letter - 'A')并打包成unsigned intresult = result << 2; result |= value;)的示例。

可能有更高效或更紧凑的方法,但这仅用于演示目的。