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 바이트로 저장할 수 있습니다.
luiscubal

답변:


17

ID는 항상 IO123456 형식입니까? 동료가 의미하는 바는 숫자 부분 만 전송한다는 것입니다. 숫자 부분은 "IO"부분을 생략하고 4 바이트에 쉽게 맞습니다.


1
이게 다야 처음 두 바이트는 항상 글자로되어 있고 나머지는 숫자로되어 있으므로 4 바이트에 쉽게 넣을 수 있습니다. 16 바이트의 999999는 F423F이므로 최대 3 바이트이므로 임의로 4 바이트가 어디에서 왔는지 모르겠습니다.
l46kok

5
@ l46kok : 3 바이트 (24 비트) 정수는 매우 드물기 때문에 32 비트 (4 바이트) 정수로 보내는 것이 더 쉽습니다. 임베디드 장치의 기본 표현 (바이트 순서)으로 가져 와도 완전히 놀라지 않을 것입니다.
Bart van Ingen Schenau

16

처음 두 문자가 일정하지 않고 (항상 문자 임) 나머지 6 문자가 항상 숫자 인 경우 숫자를 BCD ( Binary-coded decimal ) 형식 으로 변환하여 "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 비트 문자열을 만드십시오.

형식이 항상 두 글자 뒤에 숫자 문자열 인 경우 :

  • 처음 2 바이트는 그대로두고 숫자를 6 바이트 정수로 인코딩하십시오. IO123456됩니다 0x49 0x4f 0x01E240.

  • 처음 2 바이트는 그대로두고 이진 코드 10 진수 로 숫자를 압축하십시오 . IO123456됩니다 0x49 0x4f 0x12 0x34 0x56.


1

여기에 게시 된 질문의 맥락에서 HART라는 산업 프로토콜을 가리 킵니다. 이 프로토콜에는 ASCII 문자를 래핑하는 고유 한 방법이 있습니다. 이것을 Packed-ASCII라고합니다. 그러나 여전히 8자를 4로 압축하지 않습니다! Packed-ASCII에 따르면 8 개의 ASCII 바이트는 6으로 변환됩니다.

이 프로토콜에서 특정 요청의 매개 변수 길이는 항상 고정되어 있습니다. 따라서 나머지 문자는 공백 문자로 채워 져야합니다. 여전히,이 모든 것은 HART- 특정입니다. 이 작업을 수행하고 있음을 확인하면 포장 및 포장 풀기 절차를 정확하게 수행합니다.


0

'0123456'을 긴 정수로 변환하여 가능합니다.

그러나 이것은 숫자 ID에만 유효합니다.

또 다른 가능한 방식은 6 바이트 문자열을 제공하는 7 비트에서 6 비트 ECMA-1 인코딩을 변환하는 것입니다. 그러나 문자 세트는 숫자 대문자 및 제한된 문장 부호 문자로 제한됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.