Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

外文名

base64

属    性

编码方式

应    用

用于传输8Bit字节代码

定    义

8Bit字节代码的编码方式之一

可用于

HTTP环境下传递较长的标识信息

特    性

Base64编码具有不可读性

Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。

为解决此问题,可采用一种用于URL的改进Base64编码,它不仅在末尾填充‘=‘号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。

此外还有一些变种,它们将“+/”改为“_-”或“._”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。

其他应用

Mozilla Thunderbird和Evolution用Base64来保密电子邮件密码

Base64 也会经常用作一个简单的“加密”来保护某些数据,而真正的加密通常都比较繁琐。

垃圾讯息传播者用Base64来避过反垃圾邮件工具,因为那些工具通常都不会翻译Base64的讯息。

在LDIF档案,Base64用作编码字串。

3简介编辑

标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符

为解决此问题,可采用一种用于URL的改进Base64编码,它在末尾填充‘=‘号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。

此外还有一些变种,它们将“+/”改为“_-”或“._”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

规则

关于这个编码的规则:

①.把3个字符变成4个字符。

②每76个字符加一个换行符。

③.最后的结束符也要处理。

例子(1)

转换前 11111111, 11111111, 11111111 (二进制)

转换后 00111111, 00111111, 00111111, 00111111 (二进制)

上面的三个字节是原文,下面的四个字节是转换后的Base64编码,其前两位均为0。

转换后,我们用一个码表来得到我们想要的字符串(也就是最终的Base64编码),这个表是这样的:(摘自RFC2045)

转换表

Table 1: The Base64 Alphabet


索引

对应字符

索引

对应字符

索引

对应字符

索引

对应字符

0

A

17

R

34

i

51

z

1

B

18

S

35

j

52

0

2

C

19

T

36

k

53

1

3

D

20

U

37

l

54

2

4

E

21

V

38

m

55

3

5

F

22

W

39

n

56

4

6

G

23

X

40

o

57

5

7

H

24

Y

41

p

58

6

8

I

25

Z

42

q

59

7

9

J

26

a

43

r

60

8

10

K

27

b

44

s

61

9

11

L

28

c

45

t

62

+

12

M

29

d

46

u

63

/

13

N

30

e

47

v
   

14

O

31

f

48

w
   

15

P

32

g

49

x
   

16

Q

33

h

50

y
   

例子(2)

转换前 10101101,10111010,01110110

转换后 00101011, 00011011 ,00101001 ,00110110

十进制 43 27 41 54

对应码表中的值 r b p 2

所以上面的24位编码,编码后的Base64值为 rbp2

解码同理,把 rbq2 的二进制位连接上再重组得到三个8位值,得出原码。

(解码只是编码的逆过程,有关MIME的RFC还有很多,如果需要详细情况请自行查找。)

第一个字节,根据源字节的第一个字节处理。

规则:源第一字节右移两位,去掉低2位,高2位补零。

既:00 + 高6位

第二个字节,根据源字节的第一个字节和第二个字节联合处理。

规则如下,第一个字节高6位去掉然后左移四位,第二个字节右移四位

即:源第一字节低2位 + 源第2字节高4位

第三个字节,根据源字节的第二个字节和第三个字节联合处理,

规则第二个字节去掉高4位并左移两位(得高6位),第三个字节右移6位并去掉高6位(得低2位),相加即可

第四个字节,规则,源第三字节去掉高2位即可

//用更接近于编程的思维来说,编码的过程是这样的:

//第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一//个目标字符。

//然后将第一个字符与0x03(00000011)进行与(&)操作并左移4位,接着第二个字符右移4位与前者相或(|),即获得第二个目标字符。

//再将第二个字符与0x0f(00001111)进行与(&)操作并左移2位,接着第三个字符右移6位与前者相或(|),获得第三个目标字符。

//最后将第三个字符与0x3f(00111111)进行与(&)操作即获得第四个目标字符。

//在以上的每一个步骤之后,再把结果与 0x3F 进行 AND 位操作,就可以得到编码后的字符了。

可是等等……聪明的你可能会问到,原文的字节数量应该是3的倍数啊,如果这个条件不能满足的话,那该怎么办呢?

我们的解决办法是这样的:原文剩余的字节根据编码规则继续单独转(1变2,2变3;不够的位数用0补全),再用=号补满4个字节。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。因为:

一个原字节至少会变成两个目标字节

所以余数任何情况下都只可能是0,1,2这三个数中的一个。如果余数是0的话,就表示原文字节数正好是3的倍数(最理想的情况)。如果是1的话,转成2个Base64编码字符,为了让Base64编码是4的倍数,就要补2个等号;同理,如果是2的话,就要补1个等号。

4代码实现编辑

BASH版

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

base64Table=(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 + /);

function str2binary() {

    idx=0;

    for((i=0; i<${#str}; i++)); do

        dividend=$(printf "%d" "‘${str:i:1}");

        for((j=0;j<8;j++)); do

            let idx=8*i+7-j;

            let bin[$idx]=$dividend%2;

            dividend=$dividend/2;

        done;

    done;

    let idx=${#str}*8;

    for((i=0; i<appendEqualCnt*2; i++)); do

        let bin[$idx]=0;

        let idx++;

    done;

}

function calcBase64() {

    for((i=0; i<${#bin[*]}/6; i++)); do

        sum=0;

        for((j=0; j<6; j++)); do

            let idx=i*6+j;

            let n=6-1-j;

            let sum=sum+${bin[$idx]}*2**n;

        done;

        echo -n ${base64Table[$sum]};

    done

}

declare -a bin

function base64Encode() {

    read -p "please enter ASCII string:" str;

    let appendZero=${#str}*8%6;

    let bits=${#str}*8;

    appendEqualCnt=0;

    if [[ $appendZero -ne 0 ]]; then

        let appendEqualCnt=(6-$appendZero)/2;

    fi

    str2binary;

    calcBase64;

    if [[ $appendEqualCnt -eq 2 ]]; then

        echo -n "==";

    elif [[ $appendEqualCnt -eq 1 ]]; then

        echo -n "=";

    fi

    echo;

    

}

Java版

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

//模板类模板类写好了再按思路写个实现就可以了

publicinterfaceBase64{

/**

*根据传进来的字符的字节码,查询base64码表的索引,并返回所查到的索引

*

*@paramb一个编码后的字节码

*@return返回base64码表的索引

*/

publicabstractbytebaseIndex(byteb);

/**

*解码的方法

*传进来的是编码后的base64字符的字节码

*解析时是4个一组进行解析

*@paramb编码后的字符的字节码数组

*@return返回原来的字符串

*/

publicabstractStringbackEncode(byte[]b);

/**

*解码

*将4个字节码中的第1个的后6位(00xxxxxx)和第2个

*字节的前4位的后2位(00yy0000)

*还原为原来的字节码(xxxxxxyy)

*

*@paramfirst4个字节码中的第1个

*@paramsecond4个字节码中的第2个

*@return原来的字符的字节码

*/publicabstractbytebackFirst(bytefirst,bytesecond);

/**

*解码

*将4个字节码中的第2个的后4位(0000xxxx)和第3个

*字节的前6位的后4位(00yyyy00)

*还原为原来的字节码(xxxxyyyy)

*@paramsecond4个字节码中的第2个

*@paramthird4个字节码中的第3个

*@return原来的字符的字节码

*/

publicabstractbytebackSecond(bytesecond,bytethird);

/**

*解码

*将4个字节码中的第3个的后2位(000000xx)和第4个

*字节的后6位(00yyyyyy)

*还原为原来的字节码(xxyyyyyy)

*@paramthird传进来的第3个字符

*@paramfourth传进来的第4个字符

*@return原来的字符的字节码

*/publicabstractbytebackThird(bytethird,bytefourth);

/**

*解码

*将编码后的字符串数组的最后2个字节码还原为原来的字节码

*假如数组末尾剩下2个字节:

*将倒数第2个字节的前后6位(00xxxxxx)

*和倒数第一个字节的后2位(000000yy)

*还原为原来的编码(xxxxxxyy)

*假如数组末尾剩下3个字节:

*将倒数第2个字节的前后4位(0000xxxx)

*和倒数第一个字节的后4位(0000yyyy)

*还原为原来的编码(xxxxyyyy)

*@paramlast_b倒数第2个字节

*@paramnext_b倒数第1个字节

*@parammove_l倒数第2个字节移动位数的参数

*@parammove_b倒数第1个字节移动位数的参数

*@return原来的字符的字节码

*/

publicbytebackLastOne(bytelast_b,bytenext_b,intmove_l,intmove_b);

/**

*编码

*将传进来的字符编码为base64,返回一个base64的字符串

*编码时3个字节一组进行编码,传进来的是要进行编码的字符串数组

*@paramb要进行编码的字符串数组

*@return编码后的字符串

*/

publicabstractStringencode(byte[]b);

/**

*假如字符长度%3!=0,使用此方法编码末尾字符

*假如b=xxxxyyyy

*假如末尾字节个数等于1:

*将这个字节的前6位作为一个字节(00xxxxyy)

*将这个字节的后6位作为一个字节(00xxyyyy)

*假如末尾字节个数等于2:

*将这个字节的后6位作为一个字节(00xxyyyy)

*@paramb末尾的字符的字节码

*@parammove末尾的字符的字节码要移动的位数的参数

*@return编码后的字节码

*/

publicabstractbytelastOneByte(byteb,intmove);

/**

*编码

*假如b=xxxxyyyy

*将第1个字节的前6位编码为base64

*将3个字节中的第1个子节码转为(00xxxxyy)

*@paramb3个字节中的第1个字节

*@return编码后的字节码

*/

publicabstractbytefirstByte(byteb);

/**

*编码

*假如last_b=xxxxyyyynext_b=kkkkffff

*将3个字节中的第1个字节的最后2位(000000yy)

*和第2个字节的前4位(kkkk0000)编码为(00yykkkk)

*

*@paramlast_b3个字节中的第1个字节

*@paramnext_b3个字节中的第2个字节

*@return编码后的字节码

*/

publicabstractbytesecondByte(bytelast_b,bytenext_b);

/**

*编码

*假如last_b=xxxxyyyynext_b=kkkkffff

*将3个字节中的第2个字节的最后4位(0000yyyy)

*和第4个字节的前2位(kk000000)编码为(00yyyykk)

*

*

*@paramlast_b3个字节中的第2个字节

*@paramnext_b3个字节中的第3个字节

*@return编码后的字节码

*/

publicabstractbytethirdByte(bytelast_b,bytenext_b);

/**

*编码

*假如b=xxxxyyyy

*将3个字节中的第3个字节的最后6位(00xxyyyy)

*转码为(00xxyyyy)

*@paramb3个字节中的第3个字节

*@return编码后的字节码

*/

publicabstractbytefourthByte(byteb);

}

======================以下是实现类代码=====================分界线======

importjava.util.Enumeration;

importjava.util.Vector;

publicclassMyBase64EncoderimplementsBase64{

/**

*base64码表

*/

privatestaticfinalbytebase[]={0x41,0x42,0x43,0x44,0x45,0x46,

0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,

0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x61,0x62,

0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,

0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,

0x79,0x7a,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,

0x39,0x2b,0x2f};

?


1

2

3

4

5

6

7

8

9

@Override

publicbytebaseIndex(byteb){

for(inti=0;i<base.length;i++){

if(base[i]==b){

return(byte)i;

}

}

return-1;

}

?


1

2

3

4

5

6

7

8

@Override

publicStringbackEncode(byte[]b){

StringBuffersb=newStringBuffer();

Vector<Byte>list=newVector<Byte>();

intreal_len=b.length;

intlen=real_len-2;

intmore_len=len&3;

intuse_len=len-more_len;

?


1

2

3

4

5

6

7

8

9

10

11

12

for(inti=0;i<use_len;i+=4){

list.add(backFirst(baseIndex(b[i]),baseIndex(b[i+1])));

list.add(backSecond(baseIndex(b[i+1]),baseIndex(b[i+2])));

list.add(backThird(baseIndex(b[i+2]),baseIndex(b[i+3])));

}

Enumeratione=list.elements();

bytebytes[]=newbyte[list.size()];

intk=-1;

while(e.hasMoreElements()){

bytes[++k]=(Byte)e.nextElement();

}

sb.append(newString(bytes));

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

if(more_len==2){

byteb_1[]=newbyte[1];

b_1[0]=backLastOne(baseIndex(b[len-2]),baseIndex(b[len-1]),2,6);

sb.append(newString(b_1));

}

if(more_len==3){

byteb_2[]=newbyte[2];

b_2[0]=backFirst(baseIndex(b[len-3]),baseIndex(b[len-2]));

b_2[1]=backLastOne(baseIndex(b[len-2]),baseIndex(b[len-1]),4,4);

sb.append(newString(b_2));

}

returnsb.toString();

}

@Override

publicbytelastOneByte(byteb,intmove){

intr_b=b&0xff;

r_b=r_b<<move;

r_b=r_b>>>2;

return(byte)(r_b&0x3f);

}

@Override

publicbytebackLastOne(bytelast_b,bytenext_b,intmove_l,intmove_b){

intr_l=last_b&0xff;

intr_n=next_b&0xff;

r_l=r_l<<move_l;

r_n=r_n<<move_b;

r_n=r_n>>>move_b;

return(byte)((r_l|r_n)&0xff);

}

@Override

publicbytebackFirst(bytefirst,bytesecond){

intr_f=first&0xff;

intr_s=second&0xff;

r_f=r_f<<2;

r_s=r_s>>>4;

return(byte)((r_f|r_s)&0xff);

}

?


1

2

3

4

5

6

7

8

@Override

publicbytebackSecond(bytesecond,bytethird){

intr_s=second&0xff;

intr_t=third&0xff;

r_s=r_s<<4;

r_t=r_t>>>2;

return(byte)((r_s|r_t)&0xff);

}

?


1

2

3

4

5

6

7

@Override

publicbytebackThird(bytethird,bytefourth){

intr_t=third&0xff;

intr_f=fourth&0xff;

r_t=r_t<<6;

return(byte)((r_t|r_f)&0xff);

}

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

@Override

publicStringencode(byte[]b){

StringBuffersb=newStringBuffer();

intlen=b.length;

intmore_len=len%3;

intuse_len=len-more_len;

byte[]bytes=newbyte[4];

for(inti=0;i<use_len;i+=3){

bytes[0]=base[firstByte(b[i])];

bytes[1]=base[secondByte(b[i],b[i+1])];

bytes[2]=base[thirdByte(b[i+1],b[i+2])];

bytes[3]=base[fourthByte(b[i+2])];

sb.append(newString(bytes));

}

if(more_len==1){

byteb_2[]=newbyte[2];

b_2[0]=base[firstByte(b[len-1])];

b_2[1]=base[lastOneByte(b[len-1],6)];

sb.append(newString(b_2));

returnsb.append("==").toString();

}elseif(more_len==2){

byteb_3[]=newbyte[3];

b_3[0]=base[firstByte(b[len-2])];

b_3[1]=base[secondByte(b[len-2],b[len-1])];

b_3[2]=base[lastOneByte(b[len-1],4)];

sb.append(newString(b_3));

returnsb.append("=").toString();

}

returnsb.toString();

}

?


1

2

3

4

5

6

7

8

@Override

publicbytefirstByte(byteb){

//00000000000000000000000001010011

//01010011

intr_f=b&0xff;

r_f=r_f>>>2;

return(byte)(r_f&0x3f);

}

?


1

2

3

4

5

6

7

8

9

@Override

publicbytesecondByte(bytelast_b,bytenext_b){

intr_l=last_b&0xff;

intr_n=next_b&0xff;

r_l=r_l<<6;

r_l=r_l>>>2;

r_n=r_n>>>4;

return(byte)((r_l|r_n)&0x3f);

}

?


1

2

3

4

5

6

7

8

9

@Override

publicbytethirdByte(bytelast_b,bytenext_b){

intr_l=last_b&0xff;

intr_n=next_b&0xff;

r_l=r_l<<4;

r_l=r_l>>>2;

r_n=r_n>>>6;

return(byte)((r_l|r_n)&0x3f);

}

?


1

2

3

4

5

6

7

8

@Override

publicbytefourthByte(byteb){

intr_b=b&0xff;

r_b=r_b<<2;

r_b=r_b>>>2;

return(byte)(r_b&0x3f);

}

}

PHP版

[下列代码仅在GBK中实现,UTF8代码请把 if($button=="迅雷地址->普通地址") echo substr(base64_decode(str_ireplace("thunder://","",$txt1)),2,-2); 这句改为if($button=="迅雷地址->普通地址") echo substr(mb_convert_encoding(base64_decode(str_ireplace("thunder://","",$txt1))),2,-2); 并把charset=gb2312改为charset=utf-8]

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

<?php

$txt1=trim($_POST[‘text1‘]);

$txt2=trim($_POST[‘text2‘]);

$txt3=trim($_POST[‘text3‘]);

$button=$_POST[‘button‘];

?>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">

<html>

<head>

<title>迅雷和FlashGet,QQ旋风地址地址转换工具</title>

<metahttp-equiv="Content-Type"content="text/html;charset=gb2312">

<metacontent="迅雷,FlashGet,地址转换,"name="keywords">

</head>

<body>

<formname="form1"method="post"action="">

<hrsize="1">

<h3>迅雷转换</h3>

<P>转换地址:

<inputname="text1"value="<?phpecho$txt1;?>"type="text"style="width:516px;"/></P>

<P>转换后的:

<inputtype="text"value="<?php

if($button=="普通地址->迅雷地址")echo"thunder://".base64_encode("AA".$txt1."ZZ");

if($button=="迅雷地址->普通地址")echosubstr(base64_decode(str_ireplace("thunder://","",$txt1)),2,-2);

?>"style="width:516px;"/></P>

<P>

<inputtype="submit"name="button"value="普通地址->迅雷地址"/>

<inputtype="submit"name="button"value="迅雷地址->普通地址"/></P>

<h3>FlashGet转换</h3>

<P>FlashGet地址:

<inputname="text2"value="<?phpecho$txt2;?>"type="text"style="width:516px;"/></P>

<P>转换后地址:

<inputtype="text"value="<?php

if($button=="普通地址->FlashGet地址")echo"flashget://".base64_encode($txt2);

if($button=="FlashGet地址->普通地址")echostr_ireplace("[FLASHGET]","",base64_decode(str_ireplace("flashget://","",$txt2)));

?>"style="width:516px;"/></P>

<P>

<inputtype="submit"value="普通地址->FlashGet地址"name="button"/>

<inputtype="submit"value="FlashGet地址->普通地址"name="button"/></P>

<h3>QQ旋风转换</h3>

<P>QQ旋风地址:

<inputname="text3"value="<?phpecho$txt3;?>"type="text"style="width:516px;"/></P>

<P>转换后地址:

<inputtype="text"value="<?php

if($button=="普通地址->QQ旋风")echo"qqdl://".base64_encode($txt3);

if($button=="QQ旋风->普通地址")echobase64_decode(str_ireplace("qqdl://","",$txt3));

?>"style="width:516px;"/></P>

<P>

<inputtype="submit"value="普通地址->QQ旋风"name="button"/>

<inputtype="submit"value="QQ旋风->普通地址"name="button"/></P>

</form>

</body>

</html>

时间: 2024-10-23 05:18:29

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一的相关文章

从网络上下载文件

文件的下载: 使用HTTP协议下载文件 ·创建一个HttpURLConnection对象 HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection(); ·获得一个InputStream对象 urlConn.getInputStream() ·访问网络的权限 android.permission.INTERNET ·从网络上下载文件夹 HttpDownload.java中的代码: public class Http

Word 录制宏解决粘贴网络上文字格式错乱

    本文将利用Word中的录制宏来解决 复制粘贴网络上文字格式错乱的问题.     本文宏代码取自 : 知乎 李文超,感谢他的提供. Technorati 标签: Word宏 格式修正     1. 创建Word宏         新建一个word文件,点击 视图 ---> 宏 ---> 录制宏,出现如下的设置框.                 设置完后,点击宏-->结束录制,然后点击查宏,选中编辑框,弹出宏代码编辑页面,将 文章结尾处的宏代码复制到里面去,最终显示结果如下:   

使用异步任务加载网络上json数据并加载到ListView中

Android中使用网络访问来加载网上的内容,并将其解析出来加载到控件中,是一种很常见的操作.但是Android的UI线程(也就是主线程)中是不允许进行耗时操作的,因为耗时操作会阻塞主线程,影响用户体验.而访问网络同样是一个耗时操作,并且Android3.0以后是不允许在主线程中访问网络的,所以我们这里用Android封装好的AsyncTask类来完成这些耗时操作. 项目的目录结构如下: AsyncTask是一个抽象类,实际上他是封装好的一个类,底层也是用handler和thread来实现的,我

网络上的各种端口

1 tcpmux TCP 端口服务多路复用 5 rje 远程作业入口 7 echo Echo 服务 9 discard 用于连接测试的空服务 11 systat 用于列举连接了的端口的系统状态 13 daytime 给请求主机发送日期和时间 17 qotd 给连接了的主机发送每日格言 18 msp 消息发送协议 19 chargen 字符生成服务:发送无止境的字符流 20 ftp-data FTP 数据端口 21 ftp 文件传输协议(FTP)端口:有时被文件服务协议(FSP)使用 22 ssh

Java 网络编程(三) 创建和使用URL访问网络上的资源

链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951877.html 创建和使用URL访问网络上的资源 URL(Uniform Resource Locator)是统一资源定位符的简称,它表示Internet上某一资源的地址. 通过URL我们可以访问Internet上的各种网络资源,比如最常见的WWW, FTP站点.浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源. 在目前使用最为广泛的TCP/IP中对于URL中主机名

VXLAN, 一种叠加在L3网络上的L2网络

这几天看了下RFC7348,顺便翻译了一下,根据自己理解做了注解 虚拟化及租户隔离 服务器虚拟化增加了对物理网络基础设施的需求,服务器有多个虚机,要求交换机支持更大的MAC地址表. 在数据中心场景下,虚机按照VLAN分组,可能需要成千上万的VLAN,以便用来给为按照VLAN标签分组的虚机分隔流量.但是当前VLAN机制限制最多只能有4096个VLAN. 数据中心需要支持多个租户,每个租户需要分隔的网络域,单独实现分离的网络域不经济.管理员一般基于共享网络进行隔离.各租户独立进行VM的MAC和VLA

网络请求中常见的加密机制和加密算法理解

请求安全性: 服务器端在接收到请求的时候,要主动鉴别该请求是否有效,是否可接受. token:已登陆用户的识别码 解决的问题:用户调用接口时,不用每次都带上用户名和密码,避免了频繁在网络中传输密码被截获的风险. 使用场景:用户登录系统时传入用户名和密码,服务器校验成功之后,根据uuid等参数生成token返回给客户端,同时把该token和该用户的对应关系缓存在服务器端.客户端在后续的请求接口中不用每次都传入用户名和密码,只需要传入token即可.服务器会根据token确定客户端的身份. 注意:t

网络上可供测试的Web Service

腾讯QQ在线状态 WEB 服务Endpoint: http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx Disco: http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?discoWSDL: http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl通过输入QQ号码(String)检测QQ

使用trickle限制网络上传和下载速度

使用trickle限制网络上传和下载速度 yum install trickleTrickle如何工作? Trickle通过控制socket数据读写量来控制和限制应用的上传/下载速度.它使用另一个版本的BSD套接字API,但是区别是trickle还管理socket调用.要注意的是trickle使用动态链接和加载,所以它只对于使用"Glibc库"的程序有用.由于trickle可以设置数据在socket上的传输延迟,所以它可以用来限制一个应用的网络带宽.Trickle不能做什么?    T