Tech Note 10: The Bits 'n Bytes Lib

Aug 20, 2002

© NSB Corporation. All rights reserved.


[英語版]

BitsNbyteslibはビット操作および変換を行うための多くの手軽なファンクションをNS Basic/Palmに加えます。様々なビット単位の論理演算( AND、OR、NOTオペレーションなど)、ビットの左右へのシフト、さらに2進、10進、16進の間を変換することができます。

これを使用するためには、BitsnBytesLib.prcをお使いのデバイスへのダウンロードしてください。小さなファイルでサイズは約7kです。以下の様に、startupコードの中で初期化して下さい。

     loadLibrary "BitsNBytesLib","BNB"   '大文字/小文字は正確に

これらのファンクションには、必ず定義されてるデータタイプを使う必要があります。ほとんどの引数には整数(Integer)を使います。これらのコールのためのIntegerは32ビット、Shortは16ビットで、NSBasic標準のIntegerおよびShort変数と同じです。正しくないデータタイプを使用すると、実行時にエラーになります。

共有ライブラリでルーチンを呼ぶ時、正しい変数タイプを使うことが重要です。呼ぶ側は変数タイプを使って、共有ライブラリに渡されるスタックに、値を入れます。次のコール、

c=BNB.xorInteger(16,4)

は動作しません。これでは16と4がshort、integer、floatなのかが分かりません。次のように16と4を変数に入れると正常に動作します。

dim a as integer
dim b as integer
a=16
b=4
c=BNB.xorInteger(a,b)

BitsnByteslibには以下のファイルが含まれています。

  1. BitsnByteslib.prc: \nsbasic\downloadsディレクトリと使用されるデバイスに入れる
  2. BitsnByteslib.INF: \nsbasic\libディレクトリに入れる
  3. BLibUse.prj: \nsbasic\projectsディレクトリに入れる(これはサンプル)
  4. BitsNBytes_encript.zip: 暗号化用追加ファイル

BitsNbytesbibは現在最終beta版です。全ての問題点はnipponsupport© nsbasic.comへお送り下さい。


AndInteger(a,b)

AとBをビット単位でAND(論理積演算:相対するビットの両方が1の時のみ1になる)します。2つの引数aとbは整数(Integer)として定義されなければなりません。

関連ファンクション:AndByte、AndShort

Dim a as Integer
Dim b as Integer
Dim c as Integer
a = 63
b = 4
c = BNB.AndInteger(a,b) ' 結果は 4

Bin2Dec(A)

2進の整数を10進の整数に変換して戻します。

Dim a as Integer
Dim c as Integer
a = 100
c = BNB.Bin2Dec(a)  ' 結果は 4

CRC32(buf, count, crc)

bufの値に対しCRC32チェックサム(検査合計)の計算をします。countは文字列(buf)に使うバイト数で、crcは種値(seed)です。

Dim buf as String
Dim count as Short
Dim c as Integer
a = "Dmitry"
b = Len(a)
c = BNB.CRC32(a,b,0)   '結果は 168098323

CycleShiftInteger(a,b)

aの値のビットをbビットシフトさせます。bが正の場合、ビットは左にシフトし、負の場合は右にシフトします。シフトした時にビット列の端から落ちるビットは、逆の端に動きます。

関連ファンクション:CycleShiftByte、CycleShiftShort

Dim a as Integer
Dim b as Short
Dim c as Integer
a = 65536
b = 16
c = BNB.CycleShiftInteger(a,b)  '結果は 1

Dec2Bin(a,s)

10進を2進に変換します。2つ目の引数は文字列で、結果を入れるだけの十分な文字を埋めておく必要があります。

Dim a as Integer
Dim s as String
a = 64
s = "123456781234567812345679812345678"
BNB.Dec2Bin(a,s)   '結果 1000000

Dec2Hex(c,a)

10進を16進に変換します。文字列は、結果を入れるだけの十分な文字を埋めておく必要があります。


Dim a as String
Dim c as Integer
a = "12345678901234567890"
c = 64
BNB.Dec2Hex(c,a)  '結果は 40

EncrpytDES(src, key, dst, enc)

DESを使用して、8バイト文字列を暗号化するか解読します。src-入力文字列で8文字長でなければなりません。key - 暗号化キーで8文字長でなければなりません。dst - 結果文字列。 enc - 暗号化するには1を、解読するには0を使用。

Dim src as String
Dim dst as String
Dim res as String
Dim key as String
Dim enc as Short
Dim err as Integer

src = "ASDFGHJK"
dst = "!!!!!!!!"
res = "!!!!!!!!"
key = "12345678"
enc=1
err=BNB.EncryptDES(src,key,dst,enc)  'src は暗号化されて dst に入る
enc=0
err=BNB.EncryptDES(dst,key,res,enc)  'dst は解読されて res に入る

EqvInteger(a,b,mask)

aとbをビット単位でEQV(論理等価演算)します。maskのビットが立っている相対ビットのみチェックします。
実際は (a XOR b) AND mask の演算式を行います。ですから、maskを立てたビットの結果が1の場合、相対するaとbのビットは異なり、0の場合、相対するaとbのビットが同じであることを表します。

関連ファンクション:EqvByte、EqvShort

Dim a as Integer
Dim b as Integer
Dim c as Integer
Dim mask as Integer
a = 64
b = 62
mask = 2
c = BNB.EqvInteger(a,b,mask)  '結果は 2

getBitInteger(a,b)

整数aのbで示されるポジションのビットを戻します。

関連ファンクション:GetBitByte、GetBitShort

Dim a as Integer
Dim b as Short
Dim c as Short
a = 64
b = 6
c = BNB.GetBitInteger(a,b)  '結果は 1

GetLowWord(a)

整数aの下16ビットを戻します。

関連ファンクション:GetHiWord、GetLowByte、GetHiByte

Dim a as Integer
Dim c as Short
a = 65537
c = BNB.GetLowWord(a)  '結果は 1

Hex2dec(a)

16進を10進に変換します。


Dim a as Integer
Dim c as String
C = "40"
A = BNB.Hex2Dec(C)  '結果は 64

InverseBitInteger(a,b)

整数aのbで示されるポジションのビットを反転します。

関連ファンクション:InverseBitByte、InverseBitShort

Dim a as Integer
Dim b as Short
Dim c as Integer
a = 3
b = 1
c = BNB.InverseBitInteger(a,b) '結果は 1

NotInteger(a)

整数aをNOT(論理否定演算:ビットを反転)します。

関連ファンクション:NotByte、NotShort

Dim a as Integer
Dim c as Integer
a = 32767
c = BNB.NotInteger(a)  '結果は -32768

OrInteger(a,b)

aとbをビット単位でOR(論理和演算:相対するビットのどちらかまたは両方が1の時1になる)します。

関連ファンクション:OrByte、OrShort

Dim a as Integer
Dim b as Integer
Dim c as Integer
a = 3
b = 9
c = BNB.OrInteger(a,b)  '結果は 11

ResetBitInteger(a,b)

整数aのbで示されるポジションのビットを0にします。

関連ファンクション:ResetBitByte、ResetBitShort

Dim a as Integer
Dim b as Short
Dim c as Integer
a = 3
b = 0
c = BNB.ResetBitInteger(a,b) '結果は 2

SetBitInteger(a,b)

整数aのbで示されるポジションのビットを1にします。

関連ファンクション:SetBitByte、SetBitShort

Dim a as Integer
Dim b as Short
Dim c as Integer
a = 2
b = 0
c = BNB.SetBitInteger(a,b)  '結果は 3

SetLowWord(a,b)

整数aの下2バイト(16ビット)をbと入れ替えます。

関連ファンクション:SetHiWord、SetLowByte、SetHighByte

Dim a as Integer
Dim b as Short
Dim c as Integer
a = INT(VAL(FldA.text))
b = INT(VAL(FldB.text))
c = BNB.SetLoWord(a,b)

ShiftInteger(a,b)

aの値の全てのビットをbビットシフトさせます。bが正の場合、ビットは左にシフトし、負の場合は右にシフトします。シフトした時にビット列の端から落ちるビットは失われ、逆の端に0が足されます。

関連ファンクション:ShiftByte、ShiftShort

Dim a as Integer
Dim b as Short
Dim c as Integer
a = 65536
b = 16
c = BNB.ShiftInteger(a,b)  '結果は 0

SignShiftInteger(a,b)

aの値のサインビットは動かさずに残りのビットをbビットシフトさせます。bが正の場合、ビットは左にシフトし、負の場合は右にシフトします。シフトした時にビット列の端から落ちるビットは失われ、逆の端に0が足されます。

関連ファンクション:SignShiftByte、 SignShiftShort

Dim a as Integer
Dim b as Short
Dim c as Integer
a = -4
b = 2
c = BNB.SignShiftInteger(a,b)  '結果は -16

Swap16(a)

Shortの2バイトを入れ替えます。big endianとlittle endianシステムの間でデータを変換する時にお使い下さい。

Dim A as Short
Dim B as Short
A = 256
b=BNB.Swap16(a)  'Bは1 (&h01  -> $h01)

Swap32(a)

Integerの最初の2バイトと最後の2バイトを入れ替えます。big endianとlittle endianシステムの間でデータを変換する時にお使い下さい。

Dim A as Integer
Dim B as Integer
A = 32768
B=BNB.Swap32(a)   'Bは1 (&h0100  -> $h0001)

Swap64(a)

Doubleの最初の4バイトと最後の4バイトを入れ替えます。big endianとlittle endianシステムの間でデータを変換する時にお使い下さい。Palm OSのフロート値のフォーマットではない為、結果はNS Basic/Palmでは理解出来ない値です。

Dim A as Double
Dim B as Double
A = 32768
B=BNB.Swap64(a)

Version()

BitsnByteslibのバージョンを戻します。

Dim c as Short
c = BNB.Version()  '結果は 1

XorInteger(a,b)

aとbをビット単位でXOR(排他的論理和演算:相対するビットのどちらか一方が1の時のみ1になる)し、結果を整数で戻します。

関連ファンクション:XorByte、XorShort

Dim a as Integer
Dim b as Integer
Dim c as Integer
a = 3
b = 9
c = BNB.XorInteger(a,b)  '結果は 10

 

長い文字列の暗号化(NS Basic 2.04以降)

標準EncryptDESファンクションは、暗号化できる文字列の長さとに限界があり、さらにnull文字を含んだ文字列の暗号化にも問題があります。以下の関数は長い文字列でも暗号化を行えます。

さらにWindowsデスクトップ上で暗号化および解読が行えるコードが提供されています。\nsbasic\tools\BitsNBytes_encrypt.zip

SetDESKey keyStr

EncryptDESString()およびDecryptDESString()関数と共に使用される暗号化または解読のキーを確立します。このキーの値はこれらの関数を使用する前にセットされる必要があります。一旦セットされると、この値はプログラム終了まで、後に続くオペレーションで使用されます。キーの長さが8文字以下の場合、標準のDES暗号化が使用されます。キーの長さが9〜24文字である場合、Triple-DES暗号化が使用されます。

Dim keyStr as String
keyStr = "secret"
BNB.SetDESKey keystr

EncryptDESString(plainText)

plainText文字列を暗号化した値を返します。plainText文字列は長さにして248文字以上にできません。暗号化された文字列の長さはplainText文字列より9文字までの幅で長くなります。注:SetDESKeyサブルーチンは、この関数を呼ぶ前に最低1回は呼ばれなければなりません。

Dim plainText as String
Dim encryptedText as String
plainText = "The quick brown fox jumps over the lazy dog!"
encryptedText = BNB.EncryptDESString(plainText)

DecryptDESString(encryptedText)

encryptedText文字列を標準テキストの形にして返します。encryptedText文字列は長さにして250文字以上にできません。注:SetDESKeyサブルーチンは、この関数を呼ぶ前に最低1回は呼ばれなければなりません。

Dim encryptedText as String
Dim plainText as String
plainText = BNB.DecryptDESString(encryptedText)

Windowsデスクトップ用Encryption/Decryptionコンポーネント

EncryptDESString()およびDecryptDESString()関数のWindowsコンポーネントがあります。このコンポーネントはWindowsのDLLファイルとして実行され、Visual Basic/VBAおよびVisual C/C++から呼ぶことができます。その目的はコンジットあるいはPalmデータベース・ユーティリィティに、BitsNbytesLibルーチンと同じアルゴリズムを使用して、データの暗号化/解読を許容します。

これを使用するには、EncDec.dllファイルをシステム・ディレクトリーに入れるか、あるいは現在あなたのパスにあるディレクトリーに置かなければなりません。Visual Basic/VBAについては、EncDec.basモジュールを含めてください。Visual C/C++については、EncDec.hヘッダーファイルを含めて、EncDec.libライブラリとリンクしてください(注:EncDec.dllは必要です)。

EncDec DLL関数はそれらのBitsNbytesライブラリーと同じ制限を持っています。主な違いは、すべての関数呼び出しを備えた暗号化キーを指定することと、関数が返される文字列の長さを返すということです。

VB/VBA 例

Dim KeyStr As String
Dim DecryptedStr As String
Dim EncryptedStr As String
Dim StrLen As Integer
KeyStr = "secret"
DecryptedStr = "The quick brown fox jumps over the lazy dog!"
StrLen = EncryptData(KeyStr, DecryptedStr, EncryptedStr)
DecryptedStr = ""
StrLen = DecryptData(KeyStr, EncryptedStr, DecryptedStr)

C/C++ 例

char keyStr[25];
char decryptedStr[251];
char encryptedStr[251];
int  len;
strcpy(keyStr, "secret");
strcpy(decryptedStr, "The quick brown fox jumps over the lazy dog!");
len = encryptData(keyStr, decryptedStr, encryptedStr);
strcpy(decryptedStr, "");
len = decryptData(keyStr, encryptedStr, decryptedStr);