Một tập tin .DBF gồm có một hay nhiều mẩu tin (record), mỗi mẩu tin có một hay nhiều mục tin (field). Mỗi mục tin loại Character hoặc Memo chứa dữ liệu dưới dạng chuỗi ký tự.
Bài viết này trình bày một hàm để mã hóa và giải mã dữ liệu một chuỗi ký tự. Tùy mong muốn của bạn mà chọn: mã hóa từng field hay mã hóa toàn bộ tập tin .DBF.
Dưới đây là đoạn mã lệnh của hàm Cipher(<Chuỗi>, <Khóa>) dùng để vừa mã hóa vừa giải mã một chuỗi ký tự:
FUNCTION Cipher
PARAMETER Txt, Rvalue, A, B
PUBLIC R && As Long
PUBLIC M && As Long
PUBLIC N && As Long
STORE 0 TO R, M, N
* Khoang bien thien cua cac so gia-ngau-nhien
*(luy thua cua 2)
BigNum = 32768 && As Long
PRIVATE i, c, d
* So ngau nhien khoi dau (tuy chon)
IF TYPE('Rvalue') = 'N' && IsMissing(RValue)=False
R = Rvalue
ENDIF
* Tri khoi dau cho so nhan (tuy chon)
IF TYPE('A') = 'N' && IsMissing(A) = False
M = MOD((A * 4 + 1), BigNum)
ELSE
IF M = 0
M = 69
ENDIF
ENDIF
* Tri khoi dau cho so cong them (tuy chon)
IF TYPE('B') = 'N' && IsMissing(B) = False
N = MOD((B * 2 + 1), BigNum)
ELSE
IF N = 0
N = 47
ENDIF
ENDIF
* Xu ly chuoi
FOR i = 1 TO LEN(Txt)
c = ASC(SUBSTR(Txt, i, 1))
* Chi ma hoa cac ky tu in duoc.
* Cac ky tu dac biet: !#$%&*(),... khong duoc ma hoa
DO CASE
CASE BETWEEN(c, 48, 57)
d = c - 48
CASE BETWEEN(c, 63, 90)
d = c - 53
CASE BETWEEN(c, 97, 122)
d = c - 59
OTHERWISE
d = -1
ENDCASE
* San sang ma hoa mot ky tu
IF d >= 0
* Ket sinh so gia-ngau-nhien ke tiep
R = MOD((R * M + N), BigNum)
* XOR ky tu can ma hoa voi cac bit cua
* so gia-ngau-nhien
d = BITXOR(BITAND(R, 63), d)
* Dat ky tu tro lai trong khoang ky tu in duoc
DO CASE
CASE BETWEEN(d, 0, 9)
c = d + 48
CASE BETWEEN(d, 10, 37)
c = d + 53
CASE BETWEEN(d, 38, 63)
c = d + 59
ENDCASE
* Thay the ky tu dzin bang ket qua tinh duoc
IF AT("Visual FoxPro 05", VERS()) > 0 && VFP5.0
* Tren VFP5.0 co the dung ham STUFFC de su dung
* cac chuoi chua ky tu 2-byte
Txt = STUFFC(Txt, i, 1, CHR(c))
ELSE
* Tren VFP3.0 chi co the dung ham STUFF
Txt = STUFF(Txt, i, 1, CHR(c))
ENDIF
ENDIF
ENDFOR
RETURN Txt
Tham số đầu tiên bắt buộc phải có, là chuỗi ký tự cần mã hóa, nếu bạn cần mã hóa một field kiểu dữ liệu Numeric, thì phải chuyển thành Character trước khi mã hóa, và sau đó khi giải mã phải chuyển đổi kết quả thành Numeric.
Ví dụ: Để mã hóa chuỗi: a = "chuong can chip", bạn có thể dùng lệnh:
a = Cipher(a, 1234).
Sau đó, để giải mã bạn có thể dùng cũng lệnh như vậy:
a = Cipher(a, 1234).
Con số 1234 trong ví dụ trên gọi là khóa, bạn có thể dùng con số bất kỳ, nhưng phải giống nhau lúc mã hóa và lúc giải mã.
Còn dưới đây là hàm dùng để mã hóa (bằng cách sử dụng hàm trên) các field kiểu Character và Memo của một file.DBF đang mở:
FUNCTION cDBFCipher
PARAMETERS cAliasName
LOCAL I, cTemp
IF NOT USED(cAliasName)
=MESSAGEBOX("Alias "+cAliasName+" not found")
RETURN .F.
ENDIF
SELE &cAliasName
FOR I=1 TO FCOUNT()
IF TYPE(FIELD(I)) $ "CM"
cTemp = FIELD(I)
REPLACE ALL &cTemp WITH Cipher(&cTemp) ;
FOR NOT DELETED()
ENDIF
ENDFOR
RETURN .T.
Tham số của hàm là bí danh của vùng làm việc đang mở tập tin cần mã hóa. Ví dụ:
USE NhanVien
=Cipher("NhanVien")
USE
Nếu muốn mã hóa toàn bộ tập tin để Visual Foxpro không hiểu đó là tập tin .DBF nữa, thì phải viết thêm hàm nữa. Bạn thử các ví dụ trên cho kỹ rồi có thể sáng tạo theo nhu cầu của mình nhé!
CHƯƠNG CAN CHÍP