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