HarmonyOS 鸿蒙Next 读取沙箱中的某个文件,如何转换成Uint8Array 格式

HarmonyOS 鸿蒙Next 读取沙箱中的某个文件,如何转换成Uint8Array 格式

let xmlContent: Uint8Array = getContext().resourceManager.getRawFileContentSync(“mibook.xml”);

读取沙箱文件有没有类似 读取 raw 文件这样的直接获取到 Uint8Array 对象。

2 回复

可以参考这个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(() =&gt; {
      <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(() =&gt; {
      <span class="hljs-keyword">this</span>.createFile();
    })
  Button(<span class="hljs-string">'读取文件'</span>)
    .onClick(() =&gt; {
      <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 &lt;= 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格式,可以通过以下步骤实现:

  1. 文件读取:使用鸿蒙系统提供的文件API,如FileIOFileProvider,来读取沙箱内的文件。确保你有相应的文件读取权限。

  2. 数据转换:读取到的文件数据通常是字节流(ByteBuffer)或字节数组(byte[])。你可以直接将字节数组转换为JavaScript中的Uint8Array。如果读取到的是ByteBuffer,则需要先将其内容复制到byte数组中,再进行转换。

  3. 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

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!