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コーデックの関数は以下の通りである.
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