ASCII文字列をどのように少ないバイト数に圧縮しますか?


12

私は、他のデバイスにメッセージを送信する独自​​のプロトコルを備えた組み込みデバイスで作業しており、送信されたパケットを解析するアプリケーションを作成しています。各パケットは8バイトを運びます。プロトコルは、最初のバイトがヘッダーで、残りの7バイトがデータであると定義されています。

特定のID文字列を渡そうとしていますが、ID文字列は8文字(ASCII)であるため、7バイトに収まりません。

私の同僚が私に言ったのは、元の文字列の8バイトのASCII文字列を整数(10進数)に変換し、その4バイトを送信するということです。彼らは、4バイトから元の文字列を取得できるはずだと言った。これに頭を包むのに苦労しています。

「IO123456」のようなID文字列がある場合、それは0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36のASCIIです。それを整数に変換して4バイトで圧縮すると、元の文字列を取得できます?何かが足りないのですか、同僚が間違っていますか?これは本当に奇妙な質問であると理解していますが、これは私にはまったく意味がありません。


1
各ASCII文字は7ビットのみを使用するため、8個のASCII文字を含む文字列は8 * 7ビット-7バイトで実際に保存できます。
ルイスキューバル

回答:


17

IDは常にIO123456という形式ですか?あなたの同僚が意味することは、彼が「IO」部分を省略して4バイトに簡単に収まる数値部分のみを送信することです。


1
これでした。最初の2バイトは常に文字で、残りは数字であるため、あなたが言ったように4バイトに簡単に収まります。任意の数の4バイトがどこから来たのかはわかりませんが、16進数の999999はF423Fなので、最大で3バイトです。
l46kok13年

5
@ l46kok:3バイト(24ビット)整数は非常にまれなので、おそらく32ビット(4バイト)整数として送信する方が簡単です。組み込みデバイスのネイティブ表現(バイト順)で取得しても、まったく驚かないでしょう。
バートヴァンインゲンシェナウ

16

最初の2文字が定数ではなく(ただし常に文字)、残りの6文字が常に数字の場合、「IO123456」などの文字列は、数字を2進化10進数(BCD)形式に変換することで5バイトにパックできます。

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

可能な識別子のセットが限られている場合(最初の2文字)、これらを数字にエンコードし、代わりに送信できます(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ビット文字列を作成します。

形式が常に2文字で、その後に数字列が続く場合:

  • 最初の2バイトをそのままにして、数値を6バイト整数にエンコードします。 IO123456になり0x49 0x4f 0x01E240ます。

  • 最初の2バイトはそのままにして、数字を2進化10進数としてパックします。 IO123456になり0x49 0x4f 0x12 0x34 0x56ます。


1

ここに投稿された質問の文脈から、それはHARTと呼ばれるいくつかの産業プロトコルを指します。このプロトコルには、ASCII文字をラップする独自の方法があります。Packed-ASCIIと呼ばれます。しかし、それでも8文字は4にパックされません!Packed-ASCIIによると、8つのASCIIバイトは6に変換されます。4から3など。

このプロトコルでは、特定のリクエストのパラメーターの長さが常に固定されています。そのため、残りの文字はスペース文字で埋める必要があります。それでも、これはすべてHART固有のものです。あなたがこれに取り組んでいることを確認したら、梱包と開梱の正確な手順を説明します。


0

おそらく「0123456」を長整数に変換することによって。

ただし、これは数値IDに対してのみ機能します。

もう1つの可能なスキームは、7バイトから6ビットのECMA-1エンコードに変換することです。これにより、6バイト文字列が得られますが、文字セットは数字の大文字と限定された句読点に制限されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.