Visual Foxpro

Mã hóa dữ liệu tập tin .DBF

04/04/2013 16:08

Dữ liệu trong các ứng dụng Visual Foxpro thường được lưu trong các tập tin .DBF. Có một cách đơn giản để mã hóa dữ liệu.

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 CharacterMemo 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

Ý kiến bạn đọc (0)
Tên   Email

Lên đầu trang