HarmonyOS 鸿蒙Next 读取沙箱中的某个文件,如何转换成Uint8Array 格式
HarmonyOS 鸿蒙Next 读取沙箱中的某个文件,如何转换成Uint8Array 格式
读取沙箱文件有没有类似 读取 raw 文件这样的直接获取到 Uint8Array 对象。
可以参考这个demo, 这个demo里边需要先创建文件, 他会把工程里边的raw底下的xml文件复制到应用沙箱目录下面, 然后再点击读取文件会读取刚才复制到沙箱的文件然后进行解密:
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { buffer, HashMap, util, xml } from '@kit.ArkTS';
import fs from '@ohos.file.fs';
//let key =‘SVlLaG9IRTJ5Wjdka1Jsdg==’
// let key = ‘SVlLaG9IRTJ5Wjdka1Jsdg==’
let key = ‘Q0Rza0M4VGJjNVhwYTBSUg==’
let cipherAlgName = ‘AES128|ECB|PKCS7’;
let symAlgName = ‘AES128’;
let base64Helper = new util.Base64Helper;
@Entry
@Component
struct Index {
@State message: string = ‘Hello World’;
private fileDir: string = ‘’
createFile() {
let xmlContent: Uint8Array = getContext().resourceManager.getRawFileContentSync(“mibook.xml”);
//let str:string = uint8ArrayToString(xmlContent)
<span class="hljs-keyword">let</span> cacheDir = getContext().filesDir;
<span class="hljs-keyword">this</span>.fileDir = cacheDir + <span class="hljs-string">'/HelloWorldlee.xml'</span>
<span class="hljs-keyword">let</span> file = fs.openSync(<span class="hljs-keyword">this</span>.fileDir, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
<span class="hljs-keyword">let</span> writeLen = fs.writeSync(file.fd, xmlContent.buffer);
console.info(<span class="hljs-string">"write data to file succeed and size is:"</span> + writeLen);
fs.closeSync(file)
}
readFile() {
let stat = fs.statSync(this.fileDir);
let arraybuf: ArrayBuffer = new ArrayBuffer(stat.size)
let file = fs.openSync(this.fileDir, fs.OpenMode.READ_WRITE)
fs.readSync(file.fd, arraybuf)
let uint8Array: Uint8Array = new Uint8Array(arraybuf);
let plainText: cryptoFramework.DataBlob = { data: uint8Array };
this.AES_CBC_Update(plainText)
}
build() {
Column() {
Scroll() {
Text(this.message)
.id(‘HelloWorld’)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: ‘container’, align: VerticalAlign.Center },
middle: { anchor: ‘container’, align: HorizontalAlign.Center }
})
}
Button(<span class="hljs-string">'加解密数据'</span>)
.onClick(() => {
<span class="hljs-comment">//获取加密文件</span>
<span class="hljs-keyword">let</span> xmlContent: <span class="hljs-built_in">Uint8Array</span> = getContext().resourceManager.getRawFileContentSync(<span class="hljs-string">"mibook.xml"</span>);
<span class="hljs-keyword">let</span> plainText: cryptoFramework.DataBlob = { data: xmlContent };
<span class="hljs-keyword">this</span>.AES_CBC_Update(plainText)
})
Button(<span class="hljs-string">'创建文件'</span>)
.onClick(() => {
<span class="hljs-keyword">this</span>.createFile();
})
Button(<span class="hljs-string">'读取文件'</span>)
.onClick(() => {
<span class="hljs-keyword">this</span>.readFile();
})
}
.height(<span class="hljs-string">'100%'</span>)
.width(<span class="hljs-string">'100%'</span>)
}
async AES_CBC_Update(plainText: cryptoFramework.DataBlob) {
//解密
await this.aesDecryptAll(plainText, key);
}
// 解密
async aesDecrypt(globalCipherText: cryptoFramework.DataBlob, key: string) {
let globalPlainText = “”;
try {
let globalCipher = cryptoFramework.createCipher(cipherAlgName);
let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
<span class="hljs-keyword">let</span> dataUint8Array = base64Helper.decodeSync(key)
<span class="hljs-keyword">let</span> keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array }
<span class="hljs-comment">/*
* 偏移量
* */</span>
<span class="hljs-keyword">let</span> cbcParamsSpec: cryptoFramework.IvParamsSpec = {
iv: { data: stringToUint8Array(<span class="hljs-string">"your-iv-your-iva"</span>) },
algName: <span class="hljs-string">'IvParamsSpec'</span>
};
<span class="hljs-keyword">let</span> promiseSymKey = await symKeyGenerator.convertKey(keyBlob)
await globalCipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, promiseSymKey, <span class="hljs-literal">null</span>);
<span class="hljs-keyword">let</span> updateLength = <span class="hljs-number">1024</span>;
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i <= globalCipherText.data.length / updateLength; i++) {
<span class="hljs-keyword">let</span> messageArr = globalCipherText.data.slice(i * updateLength, (i + <span class="hljs-number">1</span>) * updateLength);
<span class="hljs-keyword">let</span> message = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Uint8Array</span>(messageArr);
<span class="hljs-keyword">let</span> messageBlob: cryptoFramework.DataBlob = { data: message };
<span class="hljs-keyword">let</span> updateOutput = await globalCipher.update(messageBlob);
<span class="hljs-keyword">if</span> (updateOutput) {
globalPlainText += uint8ArrayToString(updateOutput.data);
}
}
<span class="hljs-keyword">let</span> finalOutput = await globalCipher.doFinal(<span class="hljs-literal">null</span>);
globalPlainText += uint8ArrayToString(finalOutput.data)
<span class="hljs-comment">//this.message = globalPlainText</span>
<span class="hljs-comment">// console.log("解密后的明文==》" + globalPlainText)</span>
<span class="hljs-keyword">let</span> strXml = globalPlainText
<span class="hljs-comment">// let textEncoder: util.TextEncoder = new util.TextEncoder();</span>
<span class="hljs-comment">// let arrBuffer: Uint8Array = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码</span>
<span class="hljs-comment">// // 1.基于ArrayBuffer构造XmlPullParser对象</span>
<span class="hljs-comment">// let that: xml.XmlPullParser = new xml.XmlPullParser(arrBuffer.buffer as object as ArrayBuffer, 'UTF-8');</span>
<span class="hljs-comment">// let options: xml.ParseOptions = { supportDoctype: true, ignoreNameSpace: true, tagValueCallbackFunction: func };</span>
<span class="hljs-comment">// that.parse(options);</span>
<span class="hljs-keyword">let</span> textEncoder: util.TextEncoder = <span class="hljs-keyword">new</span> util.TextEncoder();
<span class="hljs-keyword">let</span> arrBuffer: <span class="hljs-built_in">Uint8Array</span> = textEncoder.encodeInto(strXml); <span class="hljs-comment">// 对数据编码,防止包含中文字符乱码</span>
<span class="hljs-keyword">let</span> that: xml.XmlPullParser = <span class="hljs-keyword">new</span> xml.XmlPullParser(arrBuffer.buffer as object as <span class="hljs-built_in">ArrayBuffer</span>, <span class="hljs-string">'UTF-8'</span>);
<span class="hljs-keyword">let</span> options: xml.ParseOptions = {
supportDoctype: <span class="hljs-literal">false</span>,
ignoreNameSpace: <span class="hljs-literal">false</span>,
tagValueCallbackFunction: func,
attributeValueCallbackFunction: func1
};
that.parse(options);
console.info(str); <span class="hljs-comment">// 一次打印出所有的属性及其值</span>
console.log(<span class="hljs-string">"解密后的明文==》"</span> + globalPlainText.length)
} <span class="hljs-keyword">catch</span> (err) {
console.log(err.message)
}
}
// 解密
async aesDecryptAll(globalCipherText: cryptoFramework.DataBlob, key: string) {
let globalPlainText = “”;
try {
let globalCipher = cryptoFramework.createCipher(cipherAlgName);
let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
<span class="hljs-keyword">let</span> dataUint8Array = base64Helper.decodeSync(key)
<span class="hljs-keyword">let</span> keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array }
<span class="hljs-keyword">let</span> promiseSymKey = await symKeyGenerator.convertKey(keyBlob)
await globalCipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, promiseSymKey, <span class="hljs-literal">null</span>);
<span class="hljs-keyword">let</span> updateOutput = await globalCipher.update(globalCipherText);
<span class="hljs-keyword">let</span> finalOutput = await globalCipher.doFinal(<span class="hljs-literal">null</span>);
globalPlainText = uint8ArrayToString(updateOutput.data) + uint8ArrayToString(finalOutput.data)
<span class="hljs-comment">//this.message = globalPlainText</span>
<span class="hljs-comment">// console.log("解密后的明文==》" + globalPlainText)</span>
<span class="hljs-keyword">let</span> strXml = globalPlainText
<span class="hljs-comment">// let textEncoder: util.TextEncoder = new util.TextEncoder();</span>
<span class="hljs-comment">// let arrBuffer: Uint8Array = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码</span>
<span class="hljs-comment">// // 1.基于ArrayBuffer构造XmlPullParser对象</span>
<span class="hljs-comment">// let that: xml.XmlPullParser = new xml.XmlPullParser(arrBuffer.buffer as object as ArrayBuffer, 'UTF-8');</span>
<span class="hljs-comment">// let options: xml.ParseOptions = { supportDoctype: true, ignoreNameSpace: true, tagValueCallbackFunction: func };</span>
<span class="hljs-comment">// that.parse(options);</span>
namesMap.clear()
<span class="hljs-keyword">let</span> textEncoder: util.TextEncoder = <span class="hljs-keyword">new</span> util.TextEncoder();
<span class="hljs-keyword">let</span> arrBuffer: <span class="hljs-built_in">Uint8Array</span> = textEncoder.encodeInto(strXml); <span class="hljs-comment">// 对数据编码,防止包含中文字符乱码</span>
<span class="hljs-keyword">let</span> that: xml.XmlPullParser = <span class="hljs-keyword">new</span> xml.XmlPullParser(arrBuffer.buffer as object as <span class="hljs-built_in">ArrayBuffer</span>, <span class="hljs-string">'UTF-8'</span>);
<span class="hljs-keyword">let</span> options: xml.ParseOptions = {
supportDoctype: <span class="hljs-literal">true</span>,
ignoreNameSpace: <span class="hljs-literal">true</span>,
tagValueCallbackFunction: func,
attributeValueCallbackFunction: func1,
};
namesMap.length
that.parse(options);
console.info(<span class="hljs-string">"解析后的属性:"</span> + str1); <span class="hljs-comment">// 一次打印出所有的属性及其值</span>
console.log(<span class="hljs-string">"解密后的明文==》"</span> + globalPlainText.length)
} <span class="hljs-keyword">catch</span> (err) {
console.log(err.message)
}
}
}
let str: string = ‘’;
let tempName = “”
let namesMap: HashMap<string, string> = new HashMap()
let chapterNamesMap: HashMap<string, string> = new HashMap()
let chaptersXml = false
function isNull(content: string): boolean {
return content == null || content == undefined || content.length <= 0 || content.indexOf("\n") != -1
}
function func(name: string, value: string): boolean {
if (!isNull(name)) {
if (“chapters” == name) {
chaptersXml = !chaptersXml
}
tempName = name
}
if (!isNull(value) && !isNull(tempName)) {
if (chaptersXml) {
chapterNamesMap.set(tempName, value)
} else {
namesMap.set(tempName, value)
}
}
str = name + value;
console.info(‘xml解析 func :’, “name:” + name + " value:" + value);
return true; //true:继续解析 false:停止解析
}
let str1: string = ‘’;
function func1(name: string, value: string): boolean {
str1 += name + ’ ’ + value + ’ ';
console.log(“func1”, “解析属性值 name:” + name + " value:" + value)
return true; // true:继续解析 false:停止解析
}
let str2: string = ‘’;
function func2(name: xml.EventType, value: xml.ParseInfo): boolean {
str2 = name + ’ ’ + value.getDepth(); // getDepth 获取元素的当前深度
console.info(str2)
return true; //true:继续解析 false:停止解析
}
// 字符串转成字节流
function stringToUint8Array(str: string) {
return new Uint8Array(buffer.from(str, ‘utf-8’).buffer);
}
// 字节流转成可理解的字符串
function uint8ArrayToString(array: Uint8Array) {
// 将UTF-8编码转换成Unicode编码
let out: string = “”;
let index: number = 0;
let len: number = array.length;
while (index < len) {
let character = array[index++];
switch (character >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
out += String.fromCharCode(character);
break;
case 12:
case 13:
out += String.fromCharCode(((character & 0x1F) << 6) | (array[index++] & 0x3F));
break;
case 14:
out += String.fromCharCode(((character & 0x0F) << 12) | ((array[index++] & 0x3F) << 6) |
((array[index++] & 0x3F) << 0));
break;
default:
break;
}
}
return out;
}
更多关于HarmonyOS 鸿蒙Next 读取沙箱中的某个文件,如何转换成Uint8Array 格式的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next系统中,读取沙箱中的文件并将其转换为Uint8Array格式,可以通过以下步骤实现:
-
文件读取:使用鸿蒙系统提供的文件API,如
FileIO
或FileProvider
,来读取沙箱内的文件。确保你有相应的文件读取权限。 -
数据转换:读取到的文件数据通常是字节流(ByteBuffer)或字节数组(byte[])。你可以直接将字节数组转换为JavaScript中的Uint8Array。如果读取到的是ByteBuffer,则需要先将其内容复制到byte数组中,再进行转换。
-
Uint8Array构造:在JavaScript中,可以使用
Uint8Array.from()
方法或new Uint8Array()
构造函数,将字节数组转换为Uint8Array。例如,如果读取到的数据是byte数组byteArray
,则可以使用new Uint8Array(byteArray)
进行转换。
示例代码(假设已获取文件内容到byte数组byteArray
):
let byteArray = [...]; // 从文件读取到的字节数组
let uint8Array = new Uint8Array(byteArray);
以上步骤应能满足将沙箱中的文件转换为Uint8Array格式的需求。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html