如何将ASCII字符串压缩为更少的字节?


12

我正在使用具有唯一协议的嵌入式设备,该协议会将消息发送到其他设备,并且正在开发一个应用程序来解析发送的数据包。每个数据包携带8个字节。协议定义为第一个字节为标头,其余7个字节为数据。

他们正在尝试传递特定的ID字符串,但ID字符串的长度为8个字符(ASCII),因此它不能容纳7个字节。

我的同事告诉我的是,他们将把原始字符串的8个ascii字节转换为整数(十进制),并向我发送4个字节。他们告诉我,我应该能够从4个字节中获取原始字符串。在这方面,我很难缠头。

因此,如果您有一个像“ IO123456”这样的ID字符串,那么它就是ASCII中的0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36 ?我错过了什么吗?还是我的同事误会了?我知道这是一个非常棘手的问题,但对我而言,这没有任何意义。


1
每个ASCII字符仅占用7位,因此具有8个ASCII字符的字符串实际上可以存储在8 * 7位-7个字节中。
luiscubal

Answers:


17

ID是否始终采用以下格式:IO123456?您的同事可能意味着他只发送数字部分,该数字部分很容易容纳4个字节,而省略了“ IO”部分。


1
就是这样 前两个字节始终以字母表示,其余的始终以数字表示,因此您可以轻松地将其容纳在4个字节中。虽然我不知道在哪里的4个字节的任意数量的来源,因为在十六进制999999是F423F所以它的3个字节最多..
l46kok

5
@ l46kok:3字节(24位)整数非常罕见,因此它们可能更容易将其作为32位(4字节)整数发送。如果以嵌入式设备的本机表示形式(字节顺序)得到它,我不会感到完全惊讶。
Bart van Ingen Schenau 2013年

16

如果前两个字符不是常量(但始终是字母),而其余六个字符始终是数字,则可以通过将数字转换为二进制编码的十进制(BCD)格式,将字符串“ IO123456”打包成5个字节:

IO123456 -> 0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36
             |    |      \   /     \   /     \   /
            0x49 0x4f     0x12      0x34      0x56

如果可能的标识符数量有限(前两个字母),则可以将它们编码为一个数字,然后发送给它(只要不超过256个组合),例如:

IO -> 0x00
RD -> 0x01
WT -> 0x02
   ...
AB -> 0x10
   ...
ZZ -> 0xff

这样原始字符串将打包为4个字节,而不会丢失任何信息:

IO123456 -> 0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36
              \    /     \   /     \   /     \   /
               0x00       0x12      0x34      0x56

当然,也可以颠倒此过程以获得原始ID字符串。


3

如果字符串可以是任何字符序列:

  • 如果可以确定字符串不使用每个字节中的最高有效位,则可以将每个位都切成7位,然后使用按位运算将剩余的56位转换为可用的56位。

  • 如果字符串仅是字母和数字,请使用该集的6位表示形式,并使用48位的标识符字符串。

如果格式始终为两个字母,后跟一串数字:

  • 保留前两个字节,然后将数字编码为六个字节的整数。 IO123456成为0x49 0x4f 0x01E240

  • 保留前两个字节,然后将数字打包为二进制编码的decimalIO123456成为0x49 0x4f 0x12 0x34 0x56


1

从此处发布的问题的上下文来看,它指向一些称为HART的工业协议。该协议具有包装ASCII字符的独特方法。它称为Packed-ASCII。但是它仍然不能将8个字符压缩为4个字符!根据Packed-ASCII,将8个ASCII字节转换为6。4到3,依此类推。

在此协议中,特定请求中参数的长度始终是固定的。因此,其余字符需要用空格字符填充。尽管如此,所有这些都是HART特定的。如果您确认自己正在为此工作,我将提出包装和拆箱的确切程序。


0

可以通过将“ 0123456”转换为长整数来实现。

但这仅适用于数字ID。

另一种可能的方案是将您的7到6位ECMA-1编码转换为六个字节的字符串,但是您只能将字符集设置为数字,大写字母和一组有限的标点字符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.