(信息解码)Message Decoding(uva213)(模拟,输入输出处理)(ACM/ICPC WF 1991)

传送门

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

int code[8][1<<8];

int readchar()
{
    for(;;){
        int ch=getchar();
        if(ch!='\n'&&ch!='\r'){
            return ch;
        }
    }
}

int readcodes()
{
    memset(code,0,sizeof(code));
    code[1][0]=readchar();
    for(int len=2;len<=7;len++){
        for(int i=0;i<(1<<len)-1;i++){
            int ch=getchar();
            if(ch==EOF){
                return 0;
            }
            if(ch=='\n'||ch=='\r'){
                return 1;
            }
            code[len][i]=ch;
        }
    }
    return 1;
}

int readint(int c)
{
    int v=0;
    while(c--){
        v=v*2+readchar()-'0';
    }
    return v;
}

int main()
{
    while(readcodes()){
        for(;;){
            int len=readint(3);
            if(len==0){
                break;
            }
            for(;;){
                int v=readint(len);
                if(v==(1<<(len))-1){
                    break;
                }
                putchar(code[len][v]);
            }
        }
        putchar('\n');
    }
    return 0;
}

实现一个BER编解码器需要用到ASN.1的数据结构和编码规则,这里我们可以使用libtasn1库来完成。 首先,需要定义一个ASN.1的数据结构,例如: ``` struct my_struct { int32_t my_int; char my_string[64]; }; ``` 然后,我们需要使用libtasn1库中提供的函数来定义这个数据结构的编码规则,例如: ``` asn1_node my_struct_desc[] = { {"my_int", ASN_INTEGER, offsetof(struct my_struct, my_int), NULL}, {"my_string", ASN_OCTET_STRING, offsetof(struct my_struct, my_string), NULL}, {NULL, 0, 0, NULL} }; asn1_static_node my_struct_static_desc = { .nodes = my_struct_desc, .name = "my_struct", .size = sizeof(struct my_struct), .optional = 0 }; asn1_parser2tree(my_struct_static_desc, &my_struct_tree); ``` 这段代码定义了一个名为my_struct的ASN.1数据结构,并使用ASN.1编码规则将其转换为一棵树形结构。 接下来,我们可以使用libtasn1库中提供的函数来进行编解码操作,例如: ``` /* 编码 */ struct my_struct ms; ms.my_int = 123; strcpy(ms.my_string, "Hello, world!"); asn1_der_coding(&my_struct_tree, &ms, &encoded_data, &encoded_len); /* 解码 */ asn1_parser2tree(my_struct_static_desc, &my_struct_tree); asn1_der_decoding(&my_struct_tree, &decoded_data, &decoded_len, encoded_data, encoded_len); ``` 这段代码可以将一个my_struct结构体编码成DER格式的数据,并将其解码回结构体。 最后,我们可以编写一个简单的输入输出界面来测试这个BER编解码器,例如: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <errno.h> #include <tasn1.h> struct my_struct { int32_t my_int; char my_string[64]; }; asn1_static_node my_struct_static_desc; int encode_my_struct(struct my_struct *ms, uint8_t **encoded_data, size_t *encoded_len) { asn1_tree my_struct_tree; asn1_parser2tree(my_struct_static_desc, &my_struct_tree); int ret = asn1_der_coding(&my_struct_tree, ms, encoded_data, encoded_len); asn1_delete_structure(&my_struct_tree); return ret; } int decode_my_struct(uint8_t *encoded_data, size_t encoded_len, struct my_struct *ms) { asn1_tree my_struct_tree; asn1_parser2tree(my_struct_static_desc, &my_struct_tree); int ret = asn1_der_decoding(&my_struct_tree, (void **)&ms, encoded_data, encoded_len); asn1_delete_structure(&my_struct_tree); return ret; } int main() { uint8_t *encoded_data = NULL; size_t encoded_len = 0; uint8_t *decoded_data = NULL; size_t decoded_len = 0; struct my_struct ms; ms.my_int = 123; strcpy(ms.my_string, "Hello, world!"); /* 编码 */ if (encode_my_struct(&ms, &encoded_data, &encoded_len) != ASN1_SUCCESS) { fprintf(stderr, "Encode error: %s\n", strerror(errno)); return 1; } /* 解码 */ if (decode_my_struct(encoded_data, encoded_len, &ms) != ASN1_SUCCESS) { fprintf(stderr, "Decode error: %s\n", strerror(errno)); return 1; } /* 输出 */ printf("my_int: %d\n", ms.my_int); printf("my_string: %s\n", ms.my_string); free(encoded_data); free(decoded_data); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值