第十一节 机试题之数据编码

来源:互联网 发布:cmd怎么测试端口 编辑:程序博客网 时间:2024/05/23 19:01
第十一节   机试题之数据编码
某部队为了防止消息泄密从而对原始数据进行编码,编码规则如下。
1)        所有信息都为ASCII 编码;
2)        在收到原始密文后将字符进行二进制逆转,如字符'A'(0x41,0100 0001B)将数据逆转后为(0x82,1000 0010B);
3)        将逆转后的数据按照16 进制打印输出(原始数据允许空格),如字符串"ABCD EFGH"加密后的输出结果为:"8242C22208A262E212"。
为了加快编码解码速度现在需要你编写一个程序实现该密文的编码。
这个题目说到底就是将一个字符转化成二进制,再将这个二进制的高低位逆转,之后输出逆变后对应数据的ASCII。
二进制高低位逆转在12.4有详细讲解,为了算法不重复,这里采用逐位逆转方法进行解答。
// text.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <string.h>
/****************************************************************
**  函数名称:  Printb
**  函数功能:  输入一个数据,将其二进制反位输出
**  入口参数:  uiValue:待转换的值
**  出口参数:   None
**  返回值    uiSum 转换之后的值
****************************************************************/
unsigned int Printb( unsigned int uiValue)
{
    unsigned int uiSum = 0 ;
    /* 将数据的二进制逆位 */
    for ( int i = 0 ; i < 8 ; i++ )
{
       uiSum = ( uiSum << 1 ) + ( uiValue & 0x01 ) ;
       uiValue = ( uiValue >> 1 ) ;
    }
    return uiSum ;
}
/****************************************************************
**  函数名称:  main
**  函数功能:  主函数
**  入口参数:  argc* argv[]
**  出口参数:  none
**  返回值    0
****************************************************************/
int main(int argc, char* argv[])
{
    char s[100] ;
    unsigned int iArray[100] ;
    scanf( "%s" , s ) ;
    /* 将字符串转化为整型数据 */
    for ( int i = 0 ; i < strlen(s) ; i++ )
    {
       iArray = s ;
    }
    /* 以十六进制输出字符串数据 */
    for ( int j = 0 ; j < strlen(s) ; j++ )
    {
       printf( "%x" , iArray[j] ) ;
    }
    printf( "\n" ) ;
    /* 以十六进制输出译码后的字符串数据 */
    for ( int k = 0 ; k < strlen(s) ; k++ )
    {
       printf( "%x" , Printb( iArray[k] ) );
    }
    printf("\n") ;
    return 0;
}
编译结果:
ABCDEFGH
4142434445464748
8242c222a262e212
请按任意键继续. . .
原创粉丝点击