VB.Net実装7 Bit符号化と復号化


7 Bit符号化は、主に1バイト文字の符号化に用いられる.1バイト文字のASCII符号は、00〜7 Fの間で、最上位が常に0であり実質的に有効なのは7 Bitのみであるため、符号化により無効な最上位を利用して、7バイトを用いて8バイト文字を格納する目的を達成することができる.
7 Bit符号化の基本ルールは簡単に言えば最上位の0を除いた後、後のバイトの下位を前のバイトの最上位有効ビットの前に移動して前のバイトを8 bitに近づけ、最後のバイトbit数が8未満の場合は上位から0を補う
例えば、「abc」が7 Bit符号化される場合、abcのASCII符号は0 x 61、0 x 62、0 x 63であり、そのbit順序は以下の通りである.
 
  bit7  
  bit6  
  bit5  
  bit4  
  bit3  
  bit2  
  bit1  
  bit0  
    a    
0
1
1
0
0
0
0
1
b
0
1
1
0
0
0
1
0
c
0
1
1
0
0
0
1
1
エンコードの手順は次のとおりです.
1、bのbit 0をaのbit 7に移動し、bを1ビット右に移動し、以下の結果を得る
 
  bit7  
  bit6  
  bit5  
  bit4  
  bit3  
  bit2  
  bit1  
  bit0  
    a    
0
1
1
0
0
0
0
1
b

0
1
1
0
0
0
1
c
0
1
1
0
0
0
1
1
2、cのbit 1をbのbit 7に、cのbit 0をbのbit 6に、さらにcを2桁右にシフトし、以下の結果を得る
 
  bit7  
  bit6  
  bit5  
  bit4  
  bit3  
  bit2  
  bit1  
  bit0  
    a    
0
1
1
0
0
0
0
1
b
1
1
1
1
0
0
0
1
c


0
1
1
0
0
0
3、c残り6 bitは8 bit未満であり、bit 7、bit 6で0を補い、以下の結果を得る
 
  bit7  
  bit6  
  bit5  
  bit4  
  bit3  
  bit2  
  bit1  
  bit0  
    a    
0
1
1
0
0
0
0
1
b
1
1
1
1
0
0
0
1
c
0
0
0
1
1
0
0
0
abc元ASCIIコードは61,263、対応する7 bitコードは61 F 118
VB.Net実装7 Bitコーデックの関数は以下の通りである.
    '7Bit 
    Private Function Encoder_7Bit(ByVal s As String) As Byte()
        Dim arrAsc() As Byte
        arrAsc = System.Text.Encoding.ASCII.GetBytes(s)

        Dim arr7Bit() As Byte

        ' 7Bit 
        If (arrAsc.Length * 7) Mod 8 = 0 Then
            ReDim arr7Bit((arrAsc.Length * 7) \ 8 - 1)
        Else
            ReDim arr7Bit((arrAsc.Length * 7) \ 8)
        End If

        Dim lBit As Integer     ' 
        Dim hBit As Integer     ' 

        Dim yy As Integer = 0
        Dim zz As Integer = 0

        For xx As Integer = 1 To arrAsc.Length - 1
            yy = xx Mod 8
            If yy <> 0 Then
                lBit = arrAsc(xx) Mod System.Math.Pow(2, yy)
                hBit = arrAsc(xx) \ System.Math.Pow(2, yy)
                arrAsc(xx) = hBit
                arr7Bit(zz) = lBit * System.Math.Pow(2, 8 - yy) + arrAsc(xx - 1)
                zz = zz + 1
            End If
        Next

        If zz <> arr7Bit.Length Then
            arr7Bit(arr7Bit.Length - 1) = arrAsc(arrAsc.Length - 1)
        End If

        Encoder_7Bit = arr7Bit

        Erase arrAsc
        Erase arr7Bit
    End Function

    '7Bit 
    Private Function Decoder_7Bit(ByVal s As Byte()) As String
        Dim arrAsc() As Byte

        ' ASCII         
        ReDim arrAsc((s.Length * 8) \ 7 - 1)

        Dim lBit As Integer     ' 
        Dim hBit As Integer     ' 

        Dim yy As Integer = 0
        Dim zz As Integer = 0

        For xx As Integer = 0 To arrAsc.Length - 1
            yy = xx Mod 8

            If yy <> 7 Then
                lBit = s(zz) Mod System.Math.Pow(2, 8 - yy - 1)
                arrAsc(xx) = lBit * System.Math.Pow(2, yy) + hBit
                hBit = s(zz) \ System.Math.Pow(2, 8 - yy - 1)

                zz = zz + 1
            Else
                arrAsc(xx) = hBit
                hBit = 0
            End If
        Next

        Decoder_7Bit = System.Text.Encoding.ASCII.GetString(arrAsc)
        Erase arrAsc
    End Function