JS解析十六进制

发布于 2022-09-13 00:29:46 字数 1088 浏览 22 评论 0

image.png

需要用JS解析十六进制,协议文档如图所示

将小端数据转换。

供测试的模拟数据:0161000ee94100d72a00000500f6285c8fc2d55c40e17a14ae47e1e23f0000000000e2aa40cdcccccccccc04401f85eb51b89e72c03333333333f33240c3f51d4229dce84214aedf41d067e47f9fbdd8080000000000000100000000000070a740

求代码...
期望结果类似:

{"ID":4322501,"BatchNumber":11213,"TrackScore":4,"TrackAzimuth":127.980000,"TrackPitch":0.480000,"TrackDistance":1489.000000,"TrackSpeed":3.600000,"TrackSpeedDirection":23.240000,"TrackSignalToNoise":19.380000,"TrackLatitude":39.490002,"TrackLogitude":116.410004,"TrackHeight":7.500000,"TraceTimeStamp":637467844469060723,"TraceType":0,"TargetType":0,"TargetThreatLevel":2,"WarningTime":230.500000}

更新:有结果了
这里涉及到计算机基础知识,字节次序等
1字节 = 8bit
一个16进制位=0.5个字节

https://www.cnblogs.com/zemli...
找了个类库
https://github.com/keichi/bin...
可以很容易的实现

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你的笑 2022-09-20 00:29:46
/* eslint-disable */

// 解析数据,注意是小端
// 后台发过来的数据
const data = "015d00d72a00000500f6285c8fc2d55c40e17a14ae47e1e23f0000000000e2aa40cdcccccccccc04401f85eb51b89e72c03333333333f33240c3f51d4229dce84214aedf41d067e47f9fbdd8080000000000000100000000000070a740";

// Module import
const Parser = require('binary-parser').Parser

// Build an IP packet header Parser
const ipHeader = new Parser()
  .endianess('little')
  .uint8('header')
  .uint16('packetLength')
  // .uint16('ID')
  .uint32('BatchNumber')
  .uint16('TrackScore')
  // .uint64be('TrackAzimuth')
  // doublele 是小端  doublebe 是大端
  .doublele('TrackAzimuth')
  .doublele('TrackAzimuth2')
  .doublele('TrackDistance')
  .doublele('TrackSpeed')
  .doublele('TrackSpeedDirection')
  .doublele('TrackSignalToNoise')
  .floatle('TrackLatitude')
  .floatle('TrackLongitude')
  .floatle('TrackHeight')
  .uint64('TraceTimeStamp')
  .uint32('TraceType')
  .uint16('TargetType')
  .uint16('TargetThreatLevel')
  .doublele('WarningTime')

// Prepare buffer to parse.
const buf2 = Buffer.from(data, 'hex')

console.log(ipHeader.parse(buf2))

殤城〤 2022-09-20 00:29:46

你这个可能不仅是16进制的问题,还涉及到编码规则问题,如果没有具体的编码规则(协议),给出的数据就不知道如何转换为你想的部分,因为单纯的16进制数据流都不能区分哪些是你的属性名,哪些是数据的。而且同样字节信息,数据格式不同,意义也是完全不同的。

你的那个协议列表中有19项(缺11),总数是95字节,提供的数据是194个字符,按16进制表示,最多是97个字节,这样存在数据信息和协议要求不对应的情况,你后来提供的数据是186个字符,也最多对应93个字节数据,总之,按你前面的协议是不能正确解析后面数据的。

当然,你提供的binary_parser库是可以用来解析数据。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文