1 Star 0 Fork 0

ScenarioSamples/BinaryParameterParsing

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

二进制数据处理案例

介绍

本示例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及以上。

使用说明

  1. 本示例仅提供简单的二进制数据处理方式示例,不适用与处理复杂的二进制数据。

实现思路

具体代码实现请参考ParseUtil

  1. 读取单字节数据:
export class ParseUtil {
  static readByte(b: Uint8Array, pos: number): number {
    return b[pos] & 0xFF;
  }
}
  1. 读取无符号16位int:
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;
    }
  }
}
  1. 读取16位int:
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;
    }
  }
}
  1. 读取无符号32位int:
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;
    }
  }
}
  1. 读取32位int:
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;
    }
  }
}
  1. 读取无符号64位int:
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;
    }
  }
}
  1. 读取64位int:
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;
    }
  }
}
  1. 读取字符串:
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;
  }
}
  1. 读取浮点数:
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

ChangeLog

修改内容 时间
完成 2024.07.18

一份简单的问卷反馈

亲爱的Harmony Next开发者,您好!
为了协助您高效开发,提高鸿蒙场景化示例的质量,希望您在浏览或使用后抽空填写一份简单的问卷,我们将会收集您的宝贵意见进行优化

点击此处填写问卷

空文件

简介

【鸿蒙 Harmony Next 示例 代码】本示例Uint8Array实现了二进制数据的处理,提供了一些简单的处理二进制数据的操作,包括:读取单字节数据、读取无/有符号16位int数据、读取无/有符号32位int数据、读取无/有符号64位int数据、读取字符串数据以及读取浮点数数据的功能 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/scenario-samples/binary-parameter-parsing.git
git@gitee.com:scenario-samples/binary-parameter-parsing.git
scenario-samples
binary-parameter-parsing
BinaryParameterParsing
master

搜索帮助