代码拉取完成,页面将自动刷新
本示例Uint8Array实现了二进制数据的处理,提供了一些简单的处理二进制数据的操作,包括: 读取单字节数据、读取无/有符号16位int数据、读取无/有符号32位int数据、读取无/有符号64位int数据、读取字符串数据以及读取浮点数数据的功能。
1.本示例仅支持标准系统上运行,支持设备:华为手机。
2.HarmonyOS系统:HarmonyOS NEXT Release及以上。
3.DevEco Studio版本:DevEco Studio 5.0.1 Release及以上。
4.HarmonyOS SDK版本:HarmonyOS 5.0.1 Release SDK及以上。
具体代码实现请参考ParseUtil
export class ParseUtil {
static readByte(b: Uint8Array, pos: number): number {
return b[pos] & 0xFF;
}
}
export class ParseUtil {
static readUInt16LE(b: Uint8Array, pos: number): number {
if (pos + 2 < b.length) {
pos = pos + 2;
return ((b[--pos] & 0xFF) << 8) | (b[--pos] & 0xFF);
} else {
return 0;
}
}
}
export class ParseUtil {
static readInt16LE(b: Uint8Array, pos: number): number {
if (pos + 2 < b.length) {
pos = pos + 2;
let x = ((b[--pos] & 0xFF) << 8) | (b[--pos] & 0xFF);
return (x >= 32768) ? x - 65536 : x;
} else {
return 0;
}
}
}
export class ParseUtil {
static readUInt32LE(b: Uint8Array, pos: number): number {
if (pos + 4 < b.length) {
pos = pos + 4;
return ((b[--pos] & 0xFF) << 24) | ((b[--pos] & 0xFF) << 16) | ((b[--pos] & 0xFF) << 8) | (b[--pos] & 0xFF);
} else {
return 0;
}
}
}
export class ParseUtil {
static readInt32LE(b: Uint8Array, pos: number): number {
if (pos + 4 < b.length) {
pos = pos + 4;
let x = ((b[--pos] & 0xFF) << 24) | ((b[--pos] & 0xFF) << 16) | ((b[--pos] & 0xFF) << 8) | (b[--pos] & 0xFF);
return ((x >= 2147483648) ? x - 4294967296 : x);
} else {
return 0;
}
}
}
export class ParseUtil {
// 64 位二进制 解析
static readUInt64LE(b: Uint8Array, pos: number): number {
if (pos + 7 < b.length) {
let result =
(((b[pos + 3] & 0xFF) << 24) | ((b[pos + 2] & 0xFF) << 16) | ((b[pos + 1] & 0xFF) << 8) |
((b[pos + 0] & 0xFF)));
// 32位表示高四位和
let result11 =
(((b[pos + 7] & 0xFF) << 24) | ((b[pos + 6] & 0xFF) << 16) | ((b[pos + 5] & 0xFF) << 8) |
((b[pos + 4] & 0xFF)));
return (result11 * 65536 * 65536 + result);
} else {
return 0;
}
}
}
export class ParseUtil {
static readInt64LE(b: Uint8Array, pos: number): number {
if (pos + 7 < b.length) {
let result =
(((b[pos + 3] & 0xFF) << 24) | ((b[pos + 2] & 0xFF) << 16) | ((b[pos + 1] & 0xFF) << 8) |
((b[pos + 0] & 0xFF)));
// 32位表示高四位和
let result11 =
(((b[pos + 7] & 0xFF) << 24) | ((b[pos + 6] & 0xFF) << 16) | ((b[pos + 5] & 0xFF) << 8) |
((b[pos + 4] & 0xFF)));
let rs = (result11 * 65536 * 65536 + result);
if (rs > 4294967296 * 2147483648 - 1) {
rs -= 4294967296 * 4294967296;
}
return rs;
} else {
return 0;
}
}
}
export class ParseUtil {
static readUTF(b: Uint8Array, pos: number): string {
// 前两个字节作为字符串的长度,判定字符串在二进制数据中的边界
let len = ParseUtil.readUInt16LE(b, pos);
pos = pos + 2;
let a: Uint8Array = new Uint8Array(len);
let ret = '';
try {
for (let i = 0; i < len; i++) {
let charCode = ParseUtil.readByte(b, pos);
a[i] = charCode;
pos++;
}
let textDecoder = util.TextDecoder.create('utf-8')
ret = textDecoder.decodeToString(a);
} catch (e) {
hilog.error(domainId, tag, e);
}
return ret;
}
}
export class ParseUtil {
static byteArrayToFloat(bytes: Uint8Array, pos: number): number {
if (pos + 3 < bytes.length) {
let b1 = bytes[pos + 3] & 0xFF;
let b2 = bytes[pos + 2] & 0xFF;
let b3 = bytes[pos + 1] & 0xFF;
let b4 = bytes[pos] & 0xFF;
let sign = 1 - (b1 >> 7 << 1); // sign = bit 0
let exp = (b1 << 1 & 0xFF | b2 >> 7) - 127; // exponent = bits 1..8
let sig = (b2 & 0x7F) << 16 | b3 << 8 | b4; // significand = bits 9..31
if (sig == 0 && exp == -127) {
return 0.0;
}
return (sign * (1 + Math.pow(2, -23) * sig) * Math.pow(2, exp));
} else {
return 0.0;
}
}
}
entry/src/main/ets/
|---entryability
| |---Entryability.ets
|---entrybackupability
| |---EntryBackupAbility.ets
|---pages
| |---Index.ets // 首页
|---utils
| |---ParseUtil // 二进制数据处理工具类
[1] Uint8Array
修改内容 | 时间 |
---|---|
完成 | 2024.07.18 |
亲爱的Harmony Next开发者,您好!
为了协助您高效开发,提高鸿蒙场景化示例的质量,希望您在浏览或使用后抽空填写一份简单的问卷,我们将会收集您的宝贵意见进行优化
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。