public class Base32 {
private static final String base32Chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
private static final int[] base32Lookup = {
0xFF, 0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, // '0', '1', '2', '3', '4', '5', '6', '7'
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // '8', '9', ':', ';', '<', '=', '>', '?'
0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G'
0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O'
0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'
0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 'X', 'Y', 'Z', '[', '\', ']', '^', '_'
0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g'
0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o'
0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 'p', 'q', 'r', 's', 't', 'u', 'v', 'w'
0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF // 'x', 'y', 'z', '{', '|', '}', '~', 'DEL'
};
public static String encode(
final byte[] bytes) {
int i = 0, index = 0, digit = 0;
int currByte, nextByte;
StringBuffer base32 = new StringBuffer((bytes.length + 7) * 8 / 5);
while (i < bytes.length) {
currByte = (bytes[i] >= 0) ? bytes[i] : (bytes[i] + 256); // unsign
/* Is the current digit going to span a byte boundary? */
if (index > 3) {
if ((i + 1) < bytes.length) {
nextByte = (bytes[i + 1] >= 0) ? bytes[i + 1] : (bytes[i + 1] + 256);
} else {
nextByte = 0;
}
digit = currByte & (0xFF >> index);
index = (index + 5) % 8;
digit <<= index;
digit |= nextByte >> (8 - index);
i++;
} else {
digit = (currByte >> (8 - (index + 5))) & 0x1F;
index = (index + 5) % 8;
if (index == 0) {
i++;
}
}
base32.append(base32Chars.charAt(digit));
}
return base32.toString();
}
public static byte[] decode(
final String base32) {
int i, index, lookup, offset, digit;
byte[] bytes = new byte[base32.length() * 5 / 8];
for (i = 0, index = 0, offset = 0; i < base32.length(); i++) {
lookup = base32.charAt(i) - '0';
/* Skip chars outside the lookup table */
if (lookup < 0 || lookup >= base32Lookup.length) {
continue;
}
digit = base32Lookup[lookup];
/* If this digit is not in the table, ignore it */
if (digit == 0xFF) {
continue;
}
if (index <= 3) {
index = (index + 5) % 8;
if (index == 0) {
bytes[offset] |= digit;
offset++;
if (offset >= bytes.length) {
break;
}
} else {
bytes[offset] |= digit << (8 - index);
}
} else {
index = (index + 5) % 8;
bytes[offset] |= (digit >>> index);
offset++;
if (offset >= bytes.length) {
break;
}
bytes[offset] |= digit << (8 - index);
}
}
return bytes;
}
}
分享到:
相关推荐
易语言Base32编码与解码是编程领域中一种数据转换技术的应用,主要涉及信息安全和数据传输。Base32是一种将二进制数据转化为可读性强的文本格式的方法,广泛用于网络协议、电子邮件以及文件存储等领域。易语言,作为...
解码过程则相反,接收Base64编码的字符串后,将每4个字符(32位)转换回3个字节的数据,如果末尾有填充的字符,会忽略掉相应的位。 在提到的"目前速度最快、效率最高",可能是指这个Base64工具采用了优化的算法,...
`调用.txt`文件可能是测试这两种编码解码方法的简单脚本,它会调用Java和JavaScript中的函数,并比较结果是否一致,确保在不同环境下的Base64编码和解码是兼容的。 总之,Java和JavaScript中Base64编码和解码的实现...
在后端,我们可以使用Java的`java.util.Base64`类进行Base64编码和解码。以下是一个简单的Servlet示例,用于接收前端发送的Base64编码字符串并解码: ```java import javax.servlet.http.*; import java.io.*; ...
了解Base32编码和解码原理对于网络安全从业者和CTF爱好者来说至关重要,因为它可以帮助他们解决涉及数据隐藏和解密的问题。通过学习和熟练掌握Base32以及其他类似的编码技术,可以提高在网络安全领域的技能和竞争力...
Base32编码解码C语言实现。 文件列表: base32.h, base32.cpp, test.cpp。 包含测试工程: VC++6.0, VC++2008, VC++2013, CentOS7-x64+gcc-4.8.5.20150623(cmake)。 提供此源码编译及使用方面的Email技术支持。 */
Base64编码基于标准的64个可打印字符,包括大小写字母、数字以及"+"和"/",并用"\n"作为每76个字符后的换行符。在解码时,这些字符会按照Base64规则还原为原始的二进制数据。 在C#中,Base64编码和解码可以通过...
在URL中,标准的Base64编码可能会包含"+"和"/"字符,这些字符在URL中需要转义,因此出现了URL安全的Base64编码。它将"+"替换为"-", "/"替换为"_", 并且不使用尾部的"="。 ```javascript // 使用js-base64库 let ...
标题中的"Base64编码解码器"是一款工具软件,它能够对数据进行Base64的编码和解码操作。这款软件提供了三种不同的编码方式:ansi、utf-8和unicode。其中, 1. ANSI(American National Standards Institute)编码,...
**提供的"Base64编码解码工具":** 这个压缩包中的"Base64"文件应该是一个工具程序,用户无需安装,解压后直接运行即可对Base64文本进行编码和解码操作。这样的工具对于开发者、网络管理员或者需要处理Base64数据的...
在提供的"base编码解码工具.zip"压缩包中,包含了对这些Base编码的加解密功能。这些工具可能包含独立的程序或者是一套集成在GUI界面中的实用程序,允许用户输入原始二进制数据或已编码的字符串,然后进行相应的编码...
在LabVIEW中,可能需要编写特定的VI来处理Base32Hex编码和解码,因为这并不是LabVIEW的标准库函数。 **LabVIEW中的编码和解码** 在LabVIEW中,你可以利用LabVIEW Utility VIs for Base64 and Base32Hex这个附件包...
在这个"base64编码解码离线工具"中,用户可以方便地对数据进行Base64编码和解码,而无需依赖互联网连接。这对于在无网络环境下处理数据或者保护隐私非常有用。开发者已经优化了工具的功能,增加了对换行符的支持。在...
以下将详细讨论Base64编码的原理、C++实现Base64编码和解码的步骤,以及如何从live555源码中移植和修改代码。 Base64编码原理: 1. 将每3个字节(24位)分为4个6位组。 2. 每个6位组转换为一个0-63的数字,然后用...
在本压缩包中,包含了一个名为"Base64编码解码.e"的易语言源码文件和一个编译好的可执行文件"Base64解码工具.exe"。易语言是一种简洁明了的中文编程语言,旨在让普通用户也能轻松进行程序开发。使用易语言编写Base64...
在提供的压缩包文件"base64"中,可能包含了更具体的Base64编码解码工具的实现,例如自定义类或扩展功能。这些源码可以作为学习和理解Base64编码工作原理的实例,也可以作为基础,帮助你开发更复杂的应用,如文件的...
QT框架,由Trolltech(现为Digia)开发,是一个跨平台的C++库,提供了丰富的功能,包括图形用户界面、网络通信、多媒体处理等,对于Base64编码和解码也提供了便捷的支持。 在QT中,我们可以利用QByteArray类和...
Java Base64 编码和解码程序,支持中文。
在Java中,处理Base64编码和解码的操作通常涉及到网络通信、数据序列化以及安全加密等方面。下面我们将详细探讨Java中的Base64编码和解码原理及其实现方式。 Base64编码的基本思想是将每3个字节(24位)的数据转换...
Java作为一种广泛使用的编程语言,提供了对Base64编码和解码的支持。 在Java中,Base64编码和解码的功能主要通过`java.util.Base64`这个类来实现,该类在Java 8及以上版本中引入。下面将详细介绍如何使用这个类进行...