字符串怎么承载 int32 信息?

2021-09-16 16:19:12 +08:00
 JustLookBy

需求:js 传输的 json 字符串里面有坐标数组,坐标数值都小于 4,096 。 尽可能压缩传输体积。

目前想法是 把 x,y 坐标直接 (x<<16)|y 聚集成一个 int32 值,刚好 4 个字节对应 utf8 4 个字节,然而有很多字符都没对应的,所以无法一一转化.

用的是 websocket 传输,虽然支持 arrayBuffer 类型,但是我的数据都是字符串格式的,还有其他信息要一起。

大佬们有什么方案吗?把坐标压缩到字符串里面节省空间

3133 次点击
所在节点    程序员
26 条回复
xiangyuecn
2021-09-16 20:05:54 +08:00
存储前后坐标的差值,大概率能变成 0-9 的一位数,只需一个字符就能存储一个数字,2 个字符存储一个坐标,压缩比目测可以达到 30%

之前写过一套经纬度坐标的压缩+解压代码,支持 6 位小数精度,150 来行代码,欢迎围观
https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/blob/master/assets/geo-echarts.js#L528-L707
also24
2021-09-16 20:07:16 +08:00
@learningman #17
我也觉得,反正都是重复字符,压缩效果应该很不错才对
elfive
2021-09-16 20:16:31 +08:00
数据压缩呀,lzma 压缩,我之前做的嵌入式程序,也是 json,也是传点坐标(两个 float,一般是上万个点),经过 lzma 压缩,能节约大概 80%的数据量。
JustLookBy
2021-09-16 20:21:04 +08:00
@xiangyuecn
@elfive 谢谢 我看下
目前先用 base64,效果还算不错。
ysc3839
2021-09-16 21:02:05 +08:00
允许换掉 JSON 的话改用 Msgpack 吧,和 JSON 兼容。
SmiteChow
2021-09-17 10:12:23 +08:00
msgpack

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/802322

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX