base64编码是做啥用的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了base64编码是做啥用的?相关的知识,希望对你有一定的参考价值。
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。详情参见http://baike.baidu.com/view/469071.htm百度百科追问
为什么电子邮件中会用到base64呢?
追答因为早期的一些邮件服务器只支持文本信息,不支持二进制信息和文件。而base64编码后的结果都是ASCII低128位,也就是都是纯文本的,适合用电子邮件来传送二进制数据
参考技术A base64是一种编码,用6个二进位来表示一个字节。按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。
在Email的传送过程中,由于历史原因,Email只被允许传送ASCII字符,即一个8位字节的低7位。因此,如果您发送了一封带有非ASCII字符(即字节的最高位是1)的Email通过有“历史问题”的网关时就可能会出现问题。
网关可能会把最高位置为0! 参考技术B Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在发送电子邮件时,服务器认证的用户名和密码需要用Base64编码,附件也需要用Base64编码。
下面简单介绍Base64算法的原理,由于代码太长就不在此贴出
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
转换后,我们用一个码表来得到我们想要的字符串(也就是最终的Base64编码),这个表是这样的:
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 (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
原文的字节最后不够3个的地方用0来补足,转换时Base64编码用=号来代替。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。
举一个例子,abc经过Base64编码以后的结果是YWJj.
发邮件的时候所写的信息自动在后台转换然后传输...
JdbcDaoSupport 是做啥用的?
【中文标题】JdbcDaoSupport 是做啥用的?【英文标题】:What is JdbcDaoSupport used for?JdbcDaoSupport 是做什么用的? 【发布时间】:2014-02-26 12:01:42 【问题描述】:在Spring中,当我们插入数据库时,我们可以使用JdbcDaoSupport
,也可以不使用。我的问题是,使用它有什么好处,我们应该在什么情况下使用它?
【问题讨论】:
【参考方案1】:根据这些答案:
Proper way to inject parent class dependencies with Spring annotations spring3-annotation-JdbcDaoSupport NamedParameterJdbcDaoSupport datasource autowire?JdbcDaoSupport、NamedParameterJdbcDaoSupport、SimpleJdbcDaoSupport是不必要的,是精神上的灰尘。它们不会保存任何代码行,因为您需要将数据源或模板注入其中。
我的建议 - 在每个数据源的 XML/类配置中创建模板并重用/注入它们,因为根据文档,模板是线程安全的:
配置后,JdbcTemplate 实例是线程安全的。如果您的应用程序访问多个数据库,这需要多个 DataSource,并且随后需要多个不同配置的 JdbcTemplate,您可能需要多个 JdbcTemplate 实例。
比较applicationContext.xml
:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="$jdbc.driverClassName"/>
<property name="url" value="$jdbc.url"/>
<property name="username" value="$jdbc.username"/>
<property name="password" value="$jdbc.password"/>
</bean>
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
和YourDaoImpl.java
:
public class YourDaoImpl implements YourDao
@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;
@Override
public int tableExists(String table)
String sql = "select count(*) from all_tables"
+ " where table_name = :tbl";
return jdbcTemplate.queryForObject(
sql, new MapSqlParameterSource("tbl", table), Integer.class);
JdbcDaoSupport.java
:
public class YourDaoImpl extends NamedParameterJdbcDaoSupport implements YourDao
@Autowired
public void setDs(DataSource dataSource)
setDataSource(dataSource);
@Override
public int tableExists(String table)
String sql = "select count(*) from all_tables"
+ " where table_name = :tbl";
return getNamedParameterJdbcTemplate()
.queryForObject(
sql,
new MapSqlParameterSource("tbl", table), Integer.class);
更新关于JdbcTemplate
/NamedParameterJdbcTemplate
这里https://jira.springsource.org/browse/SPR-11478的无状态(以及线程安全)的官方声明
【讨论】:
【参考方案2】:首先让我们指出API 将此类指定为便利类(“支持”)。我相信 JdbcDaoSupport 支持(也就是为您提供)用于 jdbc 的 DAO design 的基本实现,而模板类(参见 template pattern)将为您提供用于注入 DAO 类的 singleton。
根据我的经验,我还没有找到将我的 DAO 与 *Support 课程相结合的理由。相反,我创建了我的特定 jdbcTemplate bean 并将它们注入到我的 DAO 类中,这些类有利于组合而不是继承——通常是一种很好的面向对象的做法。
来自Spring docs,“您可以选择是否从该类继承。提供JdbcDaoSupport 类只是为了方便。”。
正如 Spring 所说,JdbcDaoSupport 只是一种便利。他们没有提到它比使用其中一种模板实现的优势。
【讨论】:
以上是关于base64编码是做啥用的?的主要内容,如果未能解决你的问题,请参考以下文章
密码学Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )