base64解密

码值

字符

码值

字符

码值

字符

码值

字符

码值

字符

码值

字符

码值

字符

码值

字符

0

A

8

I

16

Q

24

Y

32

g

40

o

48

w

56

4

1

B

9

J

17

R

25

Z

33

h

41

p

49

x

57

5

2

C

10

K

18

S

26

a

34

i

42

q

50

y

58

6

3

D

11

L

19

T

27

b

35

j

43

r

51

z

59

7

4

E

12

M

20

U

28

c

36

k

44

s

52

0

60

8

5

F

13

N

21

V

29

d

37

l

45

t

53

1

61

9

6

G

14

O

22

W

30

e

38

m

46

u

54

2

62

+

7

H

15

P

23

X

31

f

39

n

47

v

55

3

63

/

   Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。

为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换。编码表的大小为2^6=64,这也是Base64名称的由来。

如对字符’0’进行Base64加密,则是如下步骤:

字符’0’的二进制为00110000,前六位拿出来,前面补两个0则是00001100,对应表得字符M。后面不足6位,只有两位0,拿出来,前面补6个0,则是00000000,对应表得字符A。

由于还有2个6位的字节没显示,则用两个=字符补充

那么字符0的Base64编码为MA==

现在蛋蛋给了你一段加密后的Base64密文,他说题意隐藏在密文里面,如果你知道了题意,就肯定可以做出本题。密文如下:

d2hhdCBpcyB0aGUgcmVtYWluZGVyIHdoZW4gdGhlIG51bWJlciBpcyBkaXZpZGVkIGJ5IDIwMTc/

Input

第一行一个整数t,代表有t组数据,每组数据输入一个整数x,0<=x<=2^31-1



Output

输出一个整数x,x为答案

Sample Input

3
0
1
2016

Sample Output

0

1

2016

这一题的问题在于解码,它给出的步骤给了我一个误解就是每个字符都要进行加密例如  000的加密结果  MA==MA==MA==但其实结果应该是MDA6

也就是说给出一组字符串以每个字符的ASCII转换成二进制连在一起后,每次取6个,得到一个长度为6的二进制数,再转为十进制然后对照表格得到

密文

000

转二进制      001100000011000000110000

加密得到    001100   000011  000000  110000

对照表格      M            D                A                 6

即密文MDA6

由密文得原文方法

对照表格得到字符十进制数转二进制取后6位得到一串01的二进制

001100000011000000110000

转换为

0,0,0

得到:

what is the remainder when the number is divided by 2017?

即2017的余数

转换代码:

#include<stdio.h>
#include<functional>
#include<vector>
#include<queue>
#include<math.h>
#include<cstring>
#include<algorithm>
#include<iostream>
#define INF 9999999
using namespace std;
int a1[10];
char a[100];
int main()
{
    a1[0]=1;
    for(int i=1;i<10;i++)
        a1[i]=a1[i-1]*2;
    gets(a);
    int le;
    le=strlen(a);
    string s;
    for(int i=0;i<le;i++)
    {
        int b[10]={0};
        if(a[i]>='A'&&a[i]<='Z')
        {
            a[i]-='A'+0;
        }
        else if(a[i]>='a'&&a[i]<='z')
        {
            a[i]=a[i]-'a'+26;
        }
        else if(a[i]>='0'&&a[i]<='9')
        {
            a[i]=a[i]-'0'+52;
        }
        else if(a[i]=='+')
            a[i]=62;
        else if(a[i]=='/')
            a[i]=63;
        int t=0;
        while(a[i]!=0)
        {
            b[t]=a[i]%2;
            t++;
            a[i]=a[i]/2;
        }
        for(int j=5;j>=0;j--)
            s+=b[j]+'0';
    }
    for(int i=0;i<s.length();i+=8)
    {
        int t=0;
        for(int j=0;j<8;j++)
        {
            t=t+(s[i+j]-'0')*a1[7-j];
        }
        printf("%c",t);
    }
    printf("\n");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值