const buffer = Buffer.alloc(1); buffer.writeInt8(array);
时间: 2023-08-23 11:06:05 浏览: 55
`Buffer.writeInt8()` 方法只接受一个参数,即要写入的值,而不是一个数组。如果你想要将一个数组中的值写入到一个 Buffer 中,你需要使用循环来逐个写入。
例如,如果你想要将一个长度为 4 的数组 `[1, 2, 3, 4]` 写入到一个长度为 4 的 Buffer 中,你可以使用以下代码:
```javascript
const array = [1, 2, 3, 4];
const buffer = Buffer.alloc(4);
for (let i = 0; i < array.length; i++) {
buffer.writeInt8(array[i], i);
}
```
在上面的代码中,`Buffer.alloc()` 方法会创建一个长度为 4 的 Buffer 对象,初始值为 0。然后使用循环逐个将数组中的元素写入到 Buffer 中。
需要注意的是,`Buffer.writeInt8()` 方法会将要写入的值强制转换为一个有符号 8 位整数。如果要写入的值超出了这个范围,可能会导致写入的结果不正确。如果要写入的值是一个无符号整数,你可以使用 `Buffer.writeUInt8()` 方法。
相关问题
// worker.js import {Sha256} from "@aws-crypto/sha256-js"; import SparkMD5 from "spark-md5"; onmessage = async function (event) { const data = event.data; // chunk方式读取文件 const chunkSize = 1024 * 1024; // 每次读取1MB const fileSize = data.size; let offset = 0; const hash = new Sha256(); const spark = new SparkMD5.ArrayBuffer(); while (offset < fileSize) { const chunk = data.slice(offset, offset + chunkSize); const buffer = await chunk.arrayBuffer(); hash.update(buffer); spark.append(buffer); offset += chunkSize; console.log(offset / fileSize * 100 , '%'); } const sha256Value = await hash.digest(); const buffer = Array.from(new Int8Array(sha256Value)); const md5Value = spark.end(); const md5Buffer = Array.from(new Int8Array(md5Value)); console.log(sha256Value, buffer); // 输出文件的sha256值 console.log(md5Value, md5Buffer); // 输出文件的MD5值 postMessage(buffer); };优化代码计算sah256
可以考虑使用 Web Crypto API 中的 SubtleCrypto.digest() 方法来计算 SHA-256 值,这样可以避免引入第三方库。修改后的代码如下所示:
```
onmessage = async function (event) {
const data = event.data;
const chunkSize = 1024 * 1024; // 每次读取1MB
const fileSize = data.size;
let offset = 0;
const hash = await crypto.subtle.digest('SHA-256');
while (offset < fileSize) {
const chunk = data.slice(offset, offset + chunkSize);
const buffer = await chunk.arrayBuffer();
await crypto.subtle.digest('SHA-256', buffer);
offset += chunkSize;
console.log(offset / fileSize * 100 , '%');
}
const sha256Value = new Uint8Array(hash);
const buffer = Array.from(sha256Value);
console.log(sha256Value, buffer); // 输出文件的sha256值
postMessage(buffer);
};
```
其中,`crypto.subtle.digest()` 方法返回一个 Promise,该 Promise 会 resolve 为一个 ArrayBuffer,包含计算好的 SHA-256 值。可以通过将其转换为 Uint8Array 来得到最终的值。
import { Sha256 } from "@aws-crypto/sha256-js"; import SparkMD5 from "spark-md5"; onmessage = async function (event) { const data = event.data; // chunk方式读取文件 const chunkSize = 1024 * 1024; // 每次读取1MB const fileSize = data.size; let offset = 0; const hash = new Sha256(); const spark = new SparkMD5.ArrayBuffer(); while (offset < fileSize) { const chunk = data.slice(offset, offset + chunkSize); const buffer = await chunk.arrayBuffer(); hash.update(buffer); spark.append(buffer); offset += chunkSize; } const sha256Value = await hash.digest('hex'); const sha256Buffer = Array.from(new Int8Array(sha256Value)); const md5Value = spark.end(); console.log(sha256Value, sha256Buffer); // 输出文件的sha256值 console.log(md5Value); // 输出文件的MD5值 postMessage(sha256Buffer); }; 优化代码,使其能够计算sha256
这段代码已经可以计算文件的sha256哈希值了,如果您想要进一步优化代码,可以考虑以下几点:
1. 使用TypedArray类型
在代码中,将sha256哈希值转换成Int8Array类型时,先将其转换成了字符串类型,然后再将其转换成Int8Array类型。这样的操作比较繁琐,也会占用较多的内存。可以直接使用Uint8Array类型来存储哈希值,这样更加简洁和高效。例如:
```javascript
const sha256Value = await hash.digest();
const sha256Buffer = new Uint8Array(sha256Value);
```
2. 使用Blob.slice方法
在代码中,使用了File.slice方法来分块读取文件。实际上,Blob对象也提供了slice方法,可以使用它来进行分块读取。这样可以简化代码,并且不需要将文件转换成File对象。例如:
```javascript
const chunk = data.slice(offset, offset + chunkSize);
```
可以改为:
```javascript
const chunk = new Blob([data], { type: data.type }).slice(offset, offset + chunkSize);
```
3. 使用Promise.all方法
在代码中,哈希计算是串行进行的,即先计算sha256哈希值,再计算MD5哈希值。可以考虑使用Promise.all方法来并行计算,这样可以更快地得到结果。例如:
```javascript
const [sha256Value, md5Value] = await Promise.all([hash.digest(), spark.end()]);
```
将以上优化操作应用到代码中,可以得到如下代码:
```javascript
import { Sha256 } from "@aws-crypto/sha256-js";
import SparkMD5 from "spark-md5";
onmessage = async function (event) {
const data = event.data;
const chunkSize = 1024 * 1024; // 每次读取1MB
const fileSize = data.size;
let offset = 0;
const hash = new Sha256();
const spark = new SparkMD5.ArrayBuffer();
while (offset < fileSize) {
const chunk = new Blob([data], { type: data.type }).slice(offset, offset + chunkSize);
const buffer = await chunk.arrayBuffer();
hash.update(buffer);
spark.append(buffer);
offset += chunkSize;
}
const [sha256Value, md5Value] = await Promise.all([hash.digest(), spark.end()]);
const sha256Buffer = new Uint8Array(sha256Value);
console.log(sha256Value, sha256Buffer); // 输出文件的sha256值
console.log(md5Value); // 输出文件的MD5值
postMessage(sha256Buffer);
};
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)