diff --git a/src/config.js b/src/config.js index 54ba6286d71ea5916439d88b856f70345873058a..e555e231953693f04b4f46a8efb83ecdb5002f94 100644 --- a/src/config.js +++ b/src/config.js @@ -39,6 +39,7 @@ const tool = [ {'name': 'time', 'title': '时间计算器', 'cat': ['other']}, {'name': 'uuid', 'title': 'UUID生成', 'cat': ['other']}, {'name': 'jsonToObject', 'title': 'JSON转实体类', 'cat': ['conversion', 'serialize']}, + {'name': 'ascii', 'title': 'ascii转换', 'cat': ['conversion']}, ] module.exports = { diff --git a/src/tool.router.js b/src/tool.router.js index a47b512a0b20a9b8c43cd440d1123897153cd189..810cb2edb9cffffefb065c8c47d7a65beb39360a 100644 --- a/src/tool.router.js +++ b/src/tool.router.js @@ -89,6 +89,14 @@ const routes = [ { path: '/tool/uuid', component: r => require(['./views/tool/uuid.vue'], r) + }, + { + path: '/tool/jsonToObject', + component: r => require(['./views/tool/jsonToObject.vue'], r) + }, + { + path: '/tool/ascii', + component: r => require(['./views/tool/ascii.vue'], r) } ] diff --git a/src/views/tool/ascii.vue b/src/views/tool/ascii.vue new file mode 100644 index 0000000000000000000000000000000000000000..bbdb701d39966bc105f8ab830f697d794f3a0627 --- /dev/null +++ b/src/views/tool/ascii.vue @@ -0,0 +1,152 @@ + + \ No newline at end of file diff --git a/src/views/tool/library/ascii.js b/src/views/tool/library/ascii.js new file mode 100644 index 0000000000000000000000000000000000000000..6007ed1e4fdd7eb33269c06b351f2dfe380f7916 --- /dev/null +++ b/src/views/tool/library/ascii.js @@ -0,0 +1,120 @@ +// ASCII MAP +import Radix from "radix.js"; + +const ASCII_MAP = ['NUL', 'SOH', 'STX', 'ETX', 'EOT', 'ENQ', 'ACK', 'BEL', 'BS', 'TAB', 'LF', 'VT', 'FF', 'CR', 'SO', 'SI', + 'DLE', 'DC1', 'DC2', 'DC3', 'DC4', 'NAK', 'SYN', 'ETB', 'CAN', 'EM', 'SUB', 'ESC', 'FS', 'GS', 'RS', 'US', + ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', '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', '{', '|', '}', '~', 'DEL'] +// ASCII 不可显示字符 +const ASCII_HIDDEN = { + 'NUL': "空字符(Null)", + 'SOH': "标题开始", + 'STX': "本文开始", + 'ETX': "本文结束", + 'EOT': "传输结束", + 'ENQ': "请求", + 'ACK': "确认回应", + 'BEL': "响铃", + 'BS': "退格", + 'TAB': "水平定位符号", + 'LF': "换行键", + 'VT': "垂直定位符号", + 'FF': "换页键", + 'CR': "归位键", + 'SO': "取消变换(Shift out)", + 'SI': "启用变换(Shift in)", + 'DLE': "跳出数据通讯", + 'DC1': "设备控制一(XON 启用软件速度控制)", + 'DC2': "设备控制二", + 'DC3': "设备控制三(XOFF 停用软件速度控制)", + 'DC4': "设备控制四", + 'NAK': "确认失败回应", + 'SYN': "同步用暂停", + 'ETB': "区块传输结束", + 'CAN': "取消", + 'EM': "连接介质中断", + 'SUB': "替换", + 'ESC': "跳出", + 'FS': "文件分割符", + 'GS': "组群分隔符", + 'RS': "记录分隔符", + 'US': "单元分隔符", + 'DEL': "删除", +} +const radix = new Radix(); + +class Ascii { + constructor(c, type = "str") { + let dec = -1; + c = c + ""; + if (type !== "str"){ + c = c.toLowerCase(); + } + switch (type) { + case 'str': + dec = ASCII_MAP.indexOf(c) + break; + case 'dec': + dec = radix.convent(c, 10, 10); + break; + case 'hex': + dec = radix.convent(c, 16, 10); + break; + case 'oct': + dec = radix.convent(c, 8, 10); + break; + case 'bin': + dec = radix.convent(c.replace(/\b(0+)/gi, ""), 2, 10); + break; + default: + throw 'type error' + } + if (dec < 0 || dec > 127) { + throw 'input error' + } + this.decData = dec + } + + dec() { + return this.decData + "" + } + + hex() { + return (radix.convent(this.decData, 10, 16) + "").toUpperCase() + } + + oct() { + return radix.convent(this.decData, 10, 8) + "" + } + + bin() { + return (radix.convent(this.decData, 10, 2) + "").padStart(8, '0') + } + + str() { + return ASCII_MAP[this.decData] + } +} + +const convent = (s, currentType, targetType) => { + const types = ['str', 'dec', 'hex', 'oct', 'bin']; + if (!types.includes(currentType) || !types.includes(targetType)) { + throw 'type error' + } + let r = []; + for (const c of s.split(currentType === "str" ? '' : ' ')) { + let ascii = new Ascii(c, currentType); + r.push(ascii[targetType]()) + } + return r.join(targetType === "str" ? '' : ' '); +} + +export default { + convent, + Ascii, + ascii_map: ASCII_MAP, + ascii_hidden: ASCII_HIDDEN, +} \ No newline at end of file