Arduino를 사용한 Base64 인코딩 라이브러리

Arduino를 사용한 Base64 인코딩 라이브러리

Arduino를 사용한 Base64 인코딩 라이브러리

베이스 길이가 64배인 메시지로 그룹화된 65개의 기호를 사용하는 코딩 시스템입니다. 이러한 메시지(데이터 패킷)는 필요한 경우 더하기 기호(XNUMX가 사용됨)로 완성되며, 인코딩된 유용한 정보의 길이가 더 짧은 경우 종종 등호(=)로 완성됩니다.

목차

    64개의 기호를 사용하여 10개의 숫자와 코드의 대문자 및 소문자(26+26)를 사용할 수 있습니다. ASCII, 문제는 62개의 명확한 기호와 서로 다른 구현에 따라 달라지는 XNUMX개의 기호가 있다는 것입니다. 때로는 "문자"라는 표현으로 언급되기도 하지만 ASCII 인쇄 가능", 실제로는 코드 32(공백)부터 126(~)까지의 범위에 해당하며 실제로 인쇄 가능한 95입니다.

    코딩의 구현 베이스 가장 많이 사용되는 것, 즉 PEM, 이는 다음에서도 사용됩니다. 마임, 추가 "+" 및 "/" 기호와 "=" 기호를 사용하여 패킷의 길이가 0의 배수가 되도록 채웁니다. A-Z 문자는 25-26 위치, a-z 문자는 51-0 위치, 숫자 9-52는 61-62 위치, 더하기 기호(+)는 63 위치, XNUMX 위치는 슬래시(/ )로 표시됩니다.

    데이터를 형식으로 표현하는 방법 베이스 원본 데이터에서 다음 그룹을 취하는 것으로 구성됩니다. 6비트 해당 코드로 표현됩니다. 비트가 남아 있으면 오른쪽이 0으로 채워집니다. 결과 코드 수가 4의 배수가 아닌 경우 오른쪽에 등호로 채워집니다.

    다음 이미지는 코딩을 보여줍니다. ASCII 텍스트("ohm")와 텍스트가 변환되는 방식 베이스. 7개의 기호가 있으므로 최종 메시지의 끝에는 등호를 채워야 합니다. "ohm"이라는 텍스트가 있다고 할 수 있습니다. ASCII 에서 «b2htaW8="과 동일 베이스.

    Base64 인코딩 예

    코딩의 구체적인 용도 베이스 또한 일반적으로 최대 줄 길이를 부과합니다. 구현 마임 각 줄은 76자로 제한됩니다. 일반적으로 줄은 줄 끝 코드(CR, 값 0x0D로 표시됨)로 구분됩니다. ASCII) 및 또 다른 새 줄(NL, 코드에 해당) ASCII 0x0A).

    코딩 구현 시 추가되는 불편함 베이스 리소스가 거의 없는 장치에서 흔히 발생하는 경우입니다. 마이크로 컨트롤러 정보가 도착하면 코드를 작성해야 한다는 것입니다. 버퍼 이를 위해서는 특수 코드를 추가하거나 메시지 상태를 나타내는 레벨(수신과 동기화된) 핀을 사용하는 등 원본 메시지의 끝에 도달했음을 나타내는 시스템을 제공해야 합니다.

    아래 예제 코드는 Base64로 인코딩하기 위한 Arduino용 라이브러리 이는 두 가지 기준으로 구현됩니다. 도착하는 정보를 인코딩합니다( 버퍼) 경고 신호가 끝날 때까지 기다립니다.

    코드 계산의 기본 부분 베이스 이는 다음 표현식으로 수행됩니다.
    (valor_original>>(2+(numero_valor%3)*2))|resto_base64
    그리고 다음 표현식을 사용하여 나머지를 계산합니다.
    (valor_original&(MASCARA_B64>>desplazamiento))<<desplazamiento,
    desplazamiento 다음 표현식으로 계산되는 값:
    4-(numero_valor%3)*2

    이러한 표현식을 얻기 위해 따르는 프로세스는 네 가지 코드 각각의 계산을 일반화하는 것으로 구성됩니다. 베이스 이는 원래 값의 3바이트를 나타내는 결과입니다.

    Base64=((byte_1>>2)|resto)&0b00111111 resto=(byte_1&0b00000011)<<4
    Base64=((byte_2>>4)|resto)&0b00111111 resto=(byte_2&0b00001111)<<2
    Base64=((byte_3>>6)|resto)&0b00111111 resto=(byte_3&0b00111111)<<0
    Base64=((byte_3>>0)|resto)&0b00111111 resto=(byte_3&0b00111111)<<0

    텍스트와 함께 Base64 위의 의사코드는 다음의 코드를 나타냅니다. 베이스 계산되고 있는 것입니다. 표현이 사용되었습니다 byte_n 인코딩되는 n번째 바이트를 참조합니다. 텍스트 resto 인코딩되는 바이트의 남은 비트를 나타냅니다. 계산 시작 시 나머지는 0이라고 가정합니다.

    명확하게 하기 위해 이전 의사코드에서는 6비트 마스크가 모든 코드 계산에 포함되었습니다. 하지만 마지막 코드만 결정하면 됩니다. 다른 코드는 회전되어 가장 많은 두 비트가 항상 손실되기 때문입니다. 중요한.

    볼 수 있듯이 네 번째 코드는 모두 나머지이므로 나중에 나머지를 계산할 필요가 없습니다. 따라서 인코딩된 바이트당 하나씩 세 단계만 수행하면 됩니다. 패킷의 세 번째 바이트가 인코딩되지 않은 경우 마지막 코드의 오른쪽이 0으로 채워져야 한다는 점을 기억하는 것이 중요합니다. 베이스 획득.

    일반화하면 에서 코드를 계산하는 표현식을 오른쪽으로 회전시킵니다. 베이스 다음과 같이 표현될 수 있다 2+(numero_byte%3)*2 괄호 안의 부분이 2에서 4로 회전하여 각 단계에서 6, 6, XNUMX이 됩니다. 물론 이것이 일반화하는 유일한 방법은 아니지만 기능성과 무엇보다도 명확성을 위해 이 방법을 선택했습니다. 마스크(AND)는 네 번째 코드에서만 필요하고 이를 계산할 필요가 없음(모두 나머지임)을 이미 보았으므로 이를 단순화하기 위해 최종 표현식에는 포함되지 않지만 기억해야 합니다. 사용된 데이터 유형(바이트)에서는 최하위 XNUMX비트만 사용됩니다.

    나머지의 왼쪽 회전은 이전 회전과 유사한 방식으로 일반화될 수 있습니다. 또한 적용된 마스크(AND)는 동일한 비트 회전을 거치지만 반대 방향으로 진행되는 것을 볼 수 있습니다. 이것이 변위를 계산하는 이유입니다. 4-(numero_valor%3)*2 표현의 각 부분에 해당하는 의미로 적용하기 전에.

    다음 예에서는 라이브러리를 사용하여 텍스트 문자열을 인코딩하는 방법을 보여줍니다. 베이스 예를 들어 이미지와 같은 모든 데이터 세트에 사용할 수 있습니다. 다음 코드에는 명확하게 설명할 흥미로운 몇 가지 세부 정보가 있습니다. 첫째, 하드웨어 신호나 텍스트의 길이를 나타내는 대신 특수 기호(~ 기호)를 사용하여 텍스트의 끝을 나타냅니다. 논리적으로 해당 기호는 인코딩된 데이터의 일부가 될 수 없습니다.

    고려해야 할 두 번째 문제는 명백하면서도 중요한데, 대상의 디코더는 도달한 정보가 어떻게 표현되는지 알아야 한다는 것입니다. 텍스트에 세트에 속하지 않는 문자가 포함되어 있습니다. ASCII 예를 들어 인쇄 가능(32~126), 악센트가 있는 문자. 아두 이노 2바이트를 사용합니다(UTF-8)를 사용하여 이러한 문자를 나타냅니다. 일반적인 것은 단순히 사용할 수 없습니다 \0 대부분의 경우 문자가 표시되는 첫 번째 바이트는 정확히 0이기 때문에 텍스트 종결자로 사용됩니다.

    이전 예의 26행에서는 Base64로 인코딩하기 위한 Arduino용 라이브러리. 방법만 명시하면 됩니다. convertir 인코딩하려는 각 바이트 및 선택적으로 마지막 바이트인지 여부 또는 그렇지 않은 경우 메소드를 사용하여 변환을 중지합니다. terminar 끝에 도달하면.

    아래 스크린샷에서 볼 수 있듯이, 예제 프로그램은 Base64로 인코딩하기 위한 Arduino용 라이브러리 먼저 인코딩할 텍스트를 표시합니다. 베이스, 이 경우에는 유명한 거인의 노래의 시작 부분입니다. 레 루티에, 이후에 인코딩 결과 베이스 형식 줄 길이 사용 마임.

    Arduino를 사용한 Base64 인코딩. 텍스트 변환 출력 예

    코멘트 남기기

    당신은 놓쳤을 수도 있습니다