URL安全的Base64编码,解码

Base64可以将二进制转码成可见字符方便进行http传输,但是base64转码时会生成“+”,“/”,“=”这些被URL进行转码的特殊字符,导致两方面数据不一致。

我们可以在发送前将“+”,“/”,“=”替换成URL不会转码的字符,接收到数据后,再将这些字符替换回去,再进行解码。

PHP:

/**

* URL base64解码

* ‘-‘ -> ‘+‘

* ‘_‘ -> ‘/‘

* 字符串长度%4的余数,补‘=‘

* @param unknown $string

*/

public static function urlsafe_b64decode($string) {

$data = str_replace(array(‘-‘,‘_‘),array(‘+‘,‘/‘),$string);

$mod4 = strlen($data) % 4;

if ($mod4) {

$data .= substr(‘====‘, $mod4);

}

return base64_decode($data);

}

/**

* URL base64编码

* ‘+‘ -> ‘-‘

* ‘/‘ -> ‘_‘

* ‘=‘ -> ‘‘

* @param unknown $string

*/

function urlsafe_b64encode($string) {

$data = base64_encode($string);

$data = str_replace(array(‘+‘,‘/‘,‘=‘),array(‘-‘,‘_‘,‘‘),$data);

return $data;

}

OC:

#pragma - 将saveBase64编码中的"-","_"字符串转换成"+","/",字符串长度余4倍的位补"="

+(NSData*)safeUrlBase64Decode:(NSString*)safeUrlbase64Str

{

// ‘-‘ -> ‘+‘

// ‘_‘ -> ‘/‘

// 不足4倍长度,补‘=‘

NSMutableString * base64Str = [[NSMutableString alloc]initWithString:safeUrlbase64Str];

base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"-" withString:@"+"];

base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"_" withString:@"/"];

NSInteger mod4 = base64Str.length % 4;

if(mod4 > 0)

[base64Str appendString:[@"====" substringToIndex:mod4]];

NSLog(@"Base64原文:%@", base64Str);

return [GTMBase64 decodeData:[base64Str dataUsingEncoding:NSUTF8StringEncoding]];

}

#pragma - 因为Base64编码中包含有+,/,=这些不安全的URL字符串,所以要进行换字符

+(NSString*)safeUrlBase64Encode:(NSData*)data

{

// ‘+‘ -> ‘-‘

// ‘/‘ -> ‘_‘

// ‘=‘ -> ‘‘

NSString * base64Str = [GTMBase64 stringByEncodingData:data];

NSMutableString * safeBase64Str = [[NSMutableString alloc]initWithString:base64Str];

safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"+" withString:@"-"];

safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"/" withString:@"_"];

safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"=" withString:@""];

NSLog(@"safeBase64编码:%@", safeBase64Str);

return safeBase64Str;

}

Java:

public static String safeUrlBase64Encode(byte[] data){

String encodeBase64 = new BASE64Encoder().encode(data);

String safeBase64Str = encodeBase64.replace(‘+‘, ‘-‘);

safeBase64Str = safeBase64Str.replace(‘/‘, ‘_‘);

safeBase64Str = safeBase64Str.replaceAll("=", "");

return safeBase64Str;

}

public static byte[] safeUrlBase64Decode(final String safeBase64Str){

String base64Str = safeBase64Str.replace(‘-‘, ‘+‘);

base64Str = base64Str.replace(‘_‘, ‘/‘);

int mod4 = base64Str.length()%4;

if(mod4 > 0){

base64Str = base64Str + "====".substring(0, mod4);

}

return new BASE64Decoder().decodeBuffer(base64Str);

}

时间: 2024-10-13 11:45:43

URL安全的Base64编码,解码的相关文章

Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net

Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码,1 1.1. 子模式 urlsafe Or  url unsafe2 1.2. 其他的二进制数据表示法  bin2hex() ,Quoted-printable ,UUencode2 2. Base64常用api2 2.1. ------------解码api2 2.2. decode(String s, OutputStream out)2 2.3. 

URL安全的Base64编码

Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到. 然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的「/」和「+」字符变为形如「%XX」的形式,而这些「%」号在存入数据库时还需要再进行转换,因为ANSI SQL中已将「%」号用作通配符. 为解决此问题,可采用

Base64编码解码算法

Base64不是什么新奇的算法了,不过如果你没从事过页面开发(或者说动态页面开发,尤其是邮箱服务),你都不怎么了解过,只是听起来很熟悉. 对于黑客来说,Base64与MD5算法有着同样的位置,因为电子邮箱(e-mail)正文就是base64编码的. 那么,我们就一起来深入的探讨一下这个东东吧. 对于一种算法,与其问"它是什么?",不如问"它实现了什么?" Base64实现了:将任意字节转为可读字符的编码. 我们知道,除了页面上的文本,计算机中的数据还有很多是不可见的

java对文件的二进制流base64编码解码

1.java对文件的二进制流base64编码解码 一般保存文件的时候选择的方式是将url存进数据库.今天遇到一个对接传文件流的二进制base64编码,简单记录一下. 依赖于commons-io包和commons-codec包. 编码的方法如下: public static String encodeFile(File file) throws IOException { byte[] readFileToByteArray = FileUtils.readFileToByteArray(file

[C语言]Base64编码解码

Base64编码解码 一,Base64编码原理 Base64编码的字符数组如下所示 : ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 字符串转Base64编码:取3字节的字符串转换为四字节的字符串,依次往后转换.得到Base64编码字符串.具体原理如下: 1,如果需要编码的原串字节数刚好为3的倍数,那么转换规则如下: 以中文字符'严'为例,'严'字的UTF-8编码为:0xE4B8A5 = 11100100  10

OpenSSL 使用 base64 编码/解码(liang19890820)

关于 OpenSSL 的介绍及安装请参见:Windows 下编译 OpenSSL 下面主要介绍有关 OpenSSL 使用 base64 编码/解码. 简述 编码解码 更多参考 编码/解码 #include <openssl/evp.h> #include <openssl/bio.h> #include <openssl/buffer.h> #include <string> #include <iostream> using namespace

Android Base64编码解码

服务端图片的信息被转化成字符串,传到android客户端,android端需要把这些信息再解码转化成图片并保存在本地. //编码部分 String string = Base64.encodeToString(str.getBytes(),Base64.DEFAULT); //解码部分string 是服务端发来的信息 byte[] byteIcon= Base64.decode(string,Base64.DEFAULT); for (int i = 0; i < byteIcon.length

Javascript中Base64编码解码的使用实例

Javascript为我们提供了一个简单的方法来实现字符串的Base64编码和解码,分别是window.btoa()函数和window.atob()函数. 例如: 1 2 var encodedStr = window.btoa("Hello world"); //字符串编码 var decodedStr = window.atob(encodedStr); //字符串解码

C# base64 编码 解码

编码: byte[] bytes=Encoding.Default.GetBytes("要转换的字符串"); Convert.ToBase64String(bytes); 解码: //"ztKwrsTj"是"我爱你"的base64编码 byte[] outputb = Convert.FromBase64String("ztKwrsTj");    string orgStr= Encoding.Default.GetStri