JS解析十六进制

mafeifan
  • 1.1k

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...
可以很容易的实现

回复
阅读 2.8k
2 个回答
✓ 已被采纳
/* 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))

xdsnet
  • 7.6k

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏