forked from snsogbl/clip-save
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbase64Decode.js
More file actions
71 lines (61 loc) · 1.71 KB
/
base64Decode.js
File metadata and controls
71 lines (61 loc) · 1.71 KB
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
/**
* 将 Base64 编码的字符串解码为原始文本
* @author ClipSave
* @param {string} input - 输入的 Base64 编码的字符串
* @returns {string} - 解码后的原始文本
* @returns {object} - 错误信息
*/
if (item.ContentType !== "Text") {
return {
error: "只支持文本类型的剪贴板内容",
};
}
const input = item.Content || "";
if (!input) {
return {
error: "剪贴板内容为空",
};
}
// 检测是否为 Base64 编码的字符串
function isBase64(str) {
try {
// Base64 字符串通常只包含 A-Z, a-z, 0-9, +, /, = 字符
// 并且长度是 4 的倍数(可能包含填充的 =)
const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;
if (!base64Regex.test(str.trim())) {
return false;
}
// 尝试解码,如果成功则可能是 Base64
const decoded = atob(str.trim());
// 检查解码后的内容是否是可打印的 ASCII 字符或有效的 UTF-8
return /^[\x20-\x7E]*$/.test(decoded) || decoded.length > 0;
} catch (e) {
return false;
}
}
const trimmedInput = input.trim();
if (!isBase64(trimmedInput)) {
return {
error: "输入内容不是有效的 Base64 编码字符串",
};
}
try {
// 解码 Base64
const decoded = atob(trimmedInput);
// 尝试使用 TextDecoder 处理 UTF-8 编码
try {
const decoder = new TextDecoder('utf-8');
const bytes = new Uint8Array(decoded.length);
for (let i = 0; i < decoded.length; i++) {
bytes[i] = decoded.charCodeAt(i);
}
return decoder.decode(bytes);
} catch (e) {
// 如果 TextDecoder 失败,直接返回解码结果
return decoded;
}
} catch (error) {
return {
error: `解码失败: ${error.message || String(error)}`,
};
}