416 lines
18 KiB
HTML
416 lines
18 KiB
HTML
<!DOCTYPE html>
|
||
<html>
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||
<title>SFK测试</title>
|
||
<link rel='stylesheet' href="../css/styles.css" />
|
||
<script type="text/javascript" src="../fiseckey.js"></script>
|
||
<script language="JavaScript">
|
||
var dev = 0;
|
||
var app = 0;
|
||
var con = 0;
|
||
var conname = 0;
|
||
var flag = 0;
|
||
|
||
function PrintInfo(info) {
|
||
deviceManagerText.value = deviceManagerText.value + info + "\r\n";
|
||
document.getElementById("deviceManagerText").scrollTop = document.getElementById("deviceManagerText").scrollHeight;
|
||
}
|
||
function clearconsole() {
|
||
deviceManagerText.value = "";
|
||
document.getElementById("deviceManagerText").scrollTop = document.getElementById("deviceManagerText").scrollHeight;
|
||
}
|
||
|
||
function seturl(dev,app,con,conname) {
|
||
document.getElementById("indexhtml").href="../index.html?dev="+dev+"&app="+app+"&con="+con+"&conname="+conname;
|
||
document.getElementById("devhtml").href="./devicemanager.html?dev="+dev+"&app="+app+"&con="+con+"&conname="+conname;
|
||
document.getElementById("authhtml").href="./authmanager.html?dev="+dev+"&app="+app+"&con="+con+"&conname="+conname;
|
||
document.getElementById("apphtml").href="./appmanager.html?dev="+dev+"&app="+app+"&con="+con+"&conname="+conname;
|
||
document.getElementById("filehtml").href="./filemanager.html?dev="+dev+"&app="+app+"&con="+con+"&conname="+conname;
|
||
document.getElementById("containerhtml").href="./containermanager.html?dev="+dev+"&app="+app+"&con="+con+"&conname="+conname;
|
||
document.getElementById("servicehtml").href="./service.html?dev="+dev+"&app="+app+"&con="+con+"&conname="+conname;
|
||
flag = 1;
|
||
}
|
||
|
||
function decodeurl() {
|
||
var url = window.location.href;
|
||
var tmp = url.split('?');
|
||
var param = tmp[1].split('&');
|
||
dev = param[0].split('=')[1];
|
||
app = param[1].split('=')[1];
|
||
con = param[2].split('=')[1];
|
||
conname = param[3].split('=')[1];
|
||
}
|
||
|
||
window.onload=function() {
|
||
if(flag != 1)
|
||
decodeurl();
|
||
seturl(dev,app,con,conname);
|
||
}
|
||
|
||
function reload() {
|
||
if(flag != 1)
|
||
decodeurl();
|
||
seturl(dev,app,con,conname);
|
||
}
|
||
//function
|
||
function CreateFile() {
|
||
try {
|
||
var filename = authManage.filename.value;
|
||
var filesize = authManage.filesize.value;
|
||
var readright = authManage.readright.value;
|
||
var writeright = authManage.writeright.value;
|
||
var result = SKFKEY.SKF_CreateFile(app, filename, filesize, 16, 16);
|
||
if(result == 0)
|
||
PrintInfo("创建成功");
|
||
} catch (e) {
|
||
PrintInfo(e.message);
|
||
}
|
||
}
|
||
|
||
function DeleteFile() {
|
||
try {
|
||
var filename = authManage.filename.value;
|
||
var result = SKFKEY.SKF_DeleteFile(app, filename);
|
||
if(result == 0)
|
||
PrintInfo("删除成功");
|
||
} catch (e) {
|
||
PrintInfo(e.message);
|
||
}
|
||
}
|
||
|
||
function EnumFiles() {
|
||
try {
|
||
var result = SKFKEY.SKF_EnumFiles(app);
|
||
PrintInfo(result);
|
||
} catch (e) {
|
||
PrintInfo(e.message);
|
||
}
|
||
}
|
||
|
||
function GetFileInfo() {
|
||
try {
|
||
var filename = authManage.filename.value;
|
||
var result = SKFKEY.SKF_GetFileInfo(app, filename);
|
||
PrintInfo(JSON.stringify(result));
|
||
} catch (e) {
|
||
PrintInfo(e.message);
|
||
}
|
||
}
|
||
|
||
function ReadFile() {
|
||
try {
|
||
var filename = authManage.filename1.value;
|
||
var offset = parseInt(authManage.rwoffset.value);
|
||
//var datalen = parseInt(authManage.dataLen.value);
|
||
var len = SKFKEY.SKF_ReadFile(app, filename, 0, 3);
|
||
len = parseInt( len, 10 );
|
||
var result = SKFKEY.SKF_ReadFile(app, filename, 3, len)
|
||
|
||
PrintInfo("文件数据:" + result);
|
||
console.log(hexToObject(result))
|
||
} catch (e) {
|
||
PrintInfo(e.message);
|
||
}
|
||
}
|
||
|
||
function ReadFile1() {
|
||
try {
|
||
var filename = authManage.filename1.value;
|
||
var offset = parseInt(authManage.rwoffset.value);
|
||
var datalen = parseInt(authManage.dataLen.value);
|
||
var result = SKFKEY.SKF_ReadFile(app, filename, offset, datalen);
|
||
PrintInfo("文件数据:" + result);
|
||
console.log(hexToObject(result))
|
||
} catch (e) {
|
||
PrintInfo(e.message);
|
||
}
|
||
}
|
||
|
||
// 将 HEX 字符串转换为对象
|
||
function hexToObject(hexString) {
|
||
|
||
// 去除填充的 F 字符,寻找有效的 JSON 数据
|
||
let str = hexString.replace(/F+$/, ''); // 去除字符串末尾的 F 字符
|
||
|
||
// 每两位HEX字符转换成一个字符
|
||
let jsonString = ''
|
||
for (let i = 0; i < str.length; i += 2) {
|
||
jsonString += String.fromCharCode(parseInt(str.substr(i, 2), 16))
|
||
}
|
||
console.log('解析 JSON 数据', jsonString);
|
||
// 尝试解析 JSON 数据
|
||
try {
|
||
return JSON.parse(jsonString); // 返回解析后的 JSON 对象
|
||
} catch (e) {
|
||
return { error: "无法解析 JSON", rawString: jsonString }; // 返回解析失败的错误信息
|
||
}
|
||
// 将 JSON 字符串解析为对象
|
||
// return JSON.parse(jsonString);
|
||
}
|
||
|
||
function WriteFile() {
|
||
try {
|
||
var filename = authManage.filename1.value;
|
||
var offset = parseInt(authManage.rwoffset.value);
|
||
var data = authManage.writedata.value;
|
||
var datalen = parseInt(authManage.dataLen.value);
|
||
|
||
var len = '000000' + datalen
|
||
len = len.substr(len.length - 6)
|
||
|
||
writeData(app, filename, 0, datalen + 3, (len+data).toUpperCase())
|
||
PrintInfo("写入成功 File");
|
||
} catch (e) {
|
||
PrintInfo(e.message);
|
||
}
|
||
}
|
||
function WriteFile1() {
|
||
try {
|
||
var filename = authManage.filename1.value;
|
||
var offset = parseInt(authManage.rwoffset.value);
|
||
var data = authManage.writedata.value;
|
||
var datalen = parseInt(authManage.dataLen.value);
|
||
|
||
var result = SKFKEY.SKF_WriteFile(app, filename, offset, datalen, data);
|
||
if(result == 0)
|
||
PrintInfo("写入成功");
|
||
} catch (e) {
|
||
PrintInfo(e.message);
|
||
}
|
||
}
|
||
|
||
function writeData(app, filename, offset, datalen, data) {
|
||
var block = 512;
|
||
if (datalen <= block) {
|
||
SKFKEY.SKF_WriteFile(app, filename, offset, datalen, data);
|
||
} else {
|
||
// 先写入 block
|
||
var cdata = data.substr(0, block * 2)
|
||
SKFKEY.SKF_WriteFile(app, filename, offset, block, cdata);
|
||
|
||
|
||
// 检查
|
||
var result = SKFKEY.SKF_ReadFile(app, filename, offset, block);
|
||
if(result == cdata){
|
||
PrintInfo("写入成功" + offset);
|
||
} else {
|
||
PrintInfo("写入失败" + offset);
|
||
PrintInfo("写入" + cdata);
|
||
PrintInfo("读取" + result);
|
||
}
|
||
|
||
setTimeout(() => {
|
||
writeData(app, filename, offset + block, datalen - block, data.substr(block * 2))
|
||
}, 1000);
|
||
}
|
||
}
|
||
|
||
// function writeData(app, filename, offset, datalen, data) {
|
||
// const CHUNK_SIZE = 1000; // 每次固定写 1000 字节
|
||
// const HEX_CHUNK = CHUNK_SIZE * 2; // 2000 个 HEX 字符
|
||
|
||
// let currentOffset = offset;
|
||
// let remainingData = data;
|
||
// let isFirst = true;
|
||
|
||
// while (remainingData.length > 0) {
|
||
// let chunkHex;
|
||
|
||
// // ====================== 核心逻辑 ======================
|
||
// if (isFirst) {
|
||
// // 第一次:直接取前 2000 个字符
|
||
// chunkHex = remainingData.substring(0, HEX_CHUNK);
|
||
// isFirst = false;
|
||
// } else {
|
||
// // 第2、3、4次:前面补 2000 个 0 + 取后面 2000 个字符
|
||
// const realData = remainingData.substring(0, HEX_CHUNK);
|
||
// chunkHex = '0'.repeat(HEX_CHUNK) + realData;
|
||
// }
|
||
|
||
// // 实际长度
|
||
// const chunkSize = chunkHex.length / 2;
|
||
|
||
// // 调用写入
|
||
// SKFKEY.SKF_WriteFile(app, filename, currentOffset, chunkSize, chunkHex);
|
||
|
||
// // 偏移 + 剩余数据截断
|
||
// currentOffset += CHUNK_SIZE;
|
||
// remainingData = remainingData.substring(HEX_CHUNK);
|
||
// }
|
||
// }
|
||
function readData(app, filename, offset, datalen) {
|
||
let result = SKFKEY.SKF_ReadFile(app, filename, offset, readLen);
|
||
|
||
// // 最终结果
|
||
// let result = '';
|
||
// // 每次最大读取长度
|
||
// const MAX_READ = 1000;
|
||
|
||
// // 循环分段读取(比递归更安全、更易读)
|
||
// while (datalen > 0) {
|
||
// // 本次读取长度:取 2000 和剩余长度的较小值
|
||
// const readLen = Math.min(MAX_READ, datalen);
|
||
|
||
// // 读取一段数据
|
||
// const chunk = SKFKEY.SKF_ReadFile(app, filename, offset, readLen);
|
||
|
||
// // 拼接到结果
|
||
// result += chunk;
|
||
|
||
// // 偏移量前进
|
||
// offset += readLen;
|
||
// // 剩余长度减少
|
||
// datalen -= readLen;
|
||
// }
|
||
|
||
// // 最终返回完整数据
|
||
return result;
|
||
}
|
||
|
||
</script>
|
||
</head>
|
||
|
||
<body>
|
||
<div="root">
|
||
<header>
|
||
<div>
|
||
<h1 class="title">
|
||
SKF FisecKey demo
|
||
</h1>
|
||
<ul class="menu">
|
||
<li>
|
||
<a id = indexhtml onclick="reload()" href="../index.html?dev=0&app=0&con=0&conname=0">简介</a>
|
||
</li>
|
||
<li>
|
||
<a id = devhtml onclick="reload()" href="./devicemanager.html?dev=0&app=0&con=0&conname=0">设备管理</a>
|
||
</li>
|
||
<li>
|
||
<a id = apphtml onclick="reload()" href="./appmanager.html?dev=0&app=0&con=0&conname=0">应用管理</a>
|
||
</li>
|
||
<li>
|
||
<a id = authhtml onclick="reload()" href="./authmanager.html?dev=0&app=0&con=0&conname=0">访问控制</a>
|
||
</li>
|
||
<li>
|
||
<a id = filehtml onclick="reload()" href="./filemanager.html?dev=0&app=0&con=0&conname=0" class='active'>文件管理</a>
|
||
</li>
|
||
<li>
|
||
<a id = containerhtml onclick="reload()" href="./containermanager.html?dev=0&app=0&con=0&conname=0">容器管理</a>
|
||
</li>
|
||
<li>
|
||
<a id = servicehtml onclick="reload()" href="./service.html?dev=0&app=0&con=0&conname=0">密码服务</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</header>
|
||
<main>
|
||
<div class = "form1">
|
||
<form name = "authManage">
|
||
<div class="form-group">
|
||
<div class="line">
|
||
<div class="lineleft">
|
||
<label class="labelhead" for="filename">文件名称</label>
|
||
</div>
|
||
<div class="lineright">
|
||
<input type="text" id="filename"/>
|
||
</div>
|
||
</div>
|
||
<div class="line">
|
||
<div class="lineleft">
|
||
<label class="labelhead" for="filesize">文件大小</label>
|
||
</div>
|
||
<div class="lineright">
|
||
<input type="text" id="filesize"/>
|
||
</div>
|
||
</div>
|
||
<div class="line">
|
||
<div class="lineleft">
|
||
<label class="labelhead" for="readright">读权限</label>
|
||
</div>
|
||
<div class="lineright">
|
||
<select class="select" name="readrightName" id="readright">
|
||
<option value="16">操作员</option>
|
||
<option value="1">管理员</option>
|
||
<option value="255">所有人</option>
|
||
<option value="0">禁止访问</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<div class="line">
|
||
<div class="lineleft">
|
||
<label class="labelhead" for="writeright">写权限</label>
|
||
</div>
|
||
<div class="lineright">
|
||
<select class="select" name="writerightName" id="writeright">
|
||
<option value="16">操作员</option>
|
||
<option value="1">管理员</option>
|
||
<option value="255">所有人</option>
|
||
<option value="0">禁止访问</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<div class="line">
|
||
<input class="btn" type="button" value="枚举文件" onclick="EnumFiles()" />
|
||
<input class="btn" type="button" value="获取文件信息" onclick="GetFileInfo()" />
|
||
||
|
||
<input class="btn" type="button" value="创建文件" onclick="CreateFile()" />
|
||
<input class="btn" type="button" value="删除文件" onclick="DeleteFile()" />
|
||
</div>
|
||
<div class="line"><div class="hrline"></div></div>
|
||
<div class="line">
|
||
<div class="lineleft">
|
||
<label class="labelhead" for="filename1">文件名称</label>
|
||
</div>
|
||
<div class="lineright">
|
||
<input type="text" id="filename1" value="lmk"/>
|
||
</div>
|
||
</div>
|
||
<div class="line">
|
||
<div class="lineleft">
|
||
<label class="labelhead" for="writedata">写入数据</label>
|
||
</div>
|
||
<div class="lineright">
|
||
<textarea class="textarea1" id="writedata" cols="30" rows="2"></textarea>
|
||
</div>
|
||
</div>
|
||
<div class="line-help">
|
||
<div class="help-tip">
|
||
<p>
|
||
写入数据为原始数据的HEX串,相应的数据长度应为HEX串的一半
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="line">
|
||
<div class="lineleft">
|
||
<label class="labelhead" for="rwoffset">读写偏移</label>
|
||
</div>
|
||
<div class="lineright">
|
||
<input type="text1" class="shortline" id="rwoffset" value="0"/>
|
||
</div>
|
||
</div>
|
||
<div class="line">
|
||
<div class="lineleft">
|
||
<label class="labelhead" for="dataLen">数据长度</label>
|
||
</div>
|
||
<div class="lineright">
|
||
<input type="text1" class="shortline" id="dataLen" value=""/>
|
||
</div>
|
||
</div>
|
||
<div class="line">
|
||
<input class="btn" type="button" value="整段写文件" onclick="WriteFile1()" />
|
||
<input class="btn" type="button" value="整段读文件" onclick="ReadFile1()" />
|
||
<input class="btn" type="button" value="分段写文件" onclick="WriteFile()" />
|
||
<input class="btn" type="button" value="分段读文件" onclick="ReadFile()" />
|
||
</div>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</main>
|
||
</div>
|
||
<div class="footer">
|
||
<input type="button" class="footclear" value="清空" onclick="clearconsole()" />
|
||
<textarea class="footconsole" id="deviceManagerText" rows="8"></textarea>
|
||
</div>
|
||
</body>
|
||
</html>
|