Mã hóa dãy số dài thành chuỗi ngắn

Liên hệ QC

phạm quyên

Thành viên mới
Tham gia
3/5/11
Bài viết
29
Được thích
0
Em chào các anh chị, vui lòng giúp em vấn đề sau: Em muốn mã hóa dãy số dài từ 10 đến 16 chữ số thành chuỗi có độ dài ngắn hơn ( dưới 5 ký tự), khi cần thì em có thể giải mã chuỗi ngắn ra ngược lại số dài như ban đầu, Anh chị vui lòng giúp em ạ. Em cảm ơn.
ví dụ như này: số đầu vào: 1005002100470350 số đầu ra: cdb143 kiểu vậy

Số đầu vào có độ dài không cố định. độ dài từ 10 đến 16 chữ số,
 

File đính kèm

  • ma hoa.xlsx
    9.5 KB · Đọc: 7
A./ Bạn này viết linh tinh quá:
(1) . . ." muốn mã hóa dãy số dài từ 10 đến 16 chữ số thành chuỗi có độ dài ngắn hơn ( dưới 5 ký tự)"
nhưng ví dụ thì: ví dụ như này: số đầu vào: 1005002100470350 số đầu ra: cdb143

(2) Trong file lại viết: . . . "giúp em tạo làm mã hóa số đầu vào thành số đầu ra sao cho đầu ra chỉ gồm từ 5 đến 8 ký tự bất kỳ"

B./ Chắc phải nhờ vô dãy số nguyên tố
 
Bảng chữ cái tiếng Anh có tổng cộng 26 chữ cái, cộng với 10 ký số tổng cộng là 36 ký tự. Mà 36^5=60466176 thôi. Cần tối thiểu 11 ký tự, nếu phân biệt chữ hoa/thường thì cần tối thiểu 9 ký tự.
 
Vậy ta có thể lấy thêm, ngoài 36 kí tự & số trên đã nêu như @, #, $, %, &, !, *, (, ), +, - ?, /, . . . . được không các bạn?
 
A./ Bạn này viết linh tinh quá:
(1) . . ." muốn mã hóa dãy số dài từ 10 đến 16 chữ số thành chuỗi có độ dài ngắn hơn ( dưới 5 ký tự)"
nhưng ví dụ thì: ví dụ như này: số đầu vào: 1005002100470350 số đầu ra: cdb143

(2) Trong file lại viết: . . . "giúp em tạo làm mã hóa số đầu vào thành số đầu ra sao cho đầu ra chỉ gồm từ 5 đến 8 ký tự bất kỳ"

B./ Chắc phải nhờ vô dãy số nguyên tố
Cảm ơn bạn, mình giải thích hơi lộm cộm, ý mình là làm sao để xử lý cái chuỗi số dài kia thành chuỗi ngắn hơn ( từ 5 đến 8 chữ số hoặc ký tự bất kỳ) miễn sao khi cần thì có thể giải ngược lại từ chuỗi 5-8 ký tự kia thành chuỗi dài ban đầu là được ạ
 
Vẫn hiểu ý bạn thôi, nhưng viết vậy đâm ra khỏ hiểu vì thiếu nhất quán.
& quan trọng mà mình hay gặp là trợ giúp đã 1 hồi lại bị trỡ mặt!
 
Bảng chữ cái tiếng Anh có tổng cộng 26 chữ cái, cộng với 10 ký số tổng cộng là 36 ký tự. Mà 36^5=60466176 thôi. Cần tối thiểu 11 ký tự, nếu phân biệt chữ hoa/thường thì cần tối thiểu 9 ký tự.
Vậy cũng OK ạ, vậy bạn giúp mình mã hóa ra 9 ký tự cũng được ạ, miễn sao có thể giải mã về dãy số ban đầu không có sai khác gì là được ạ
Bài đã được tự động gộp:

Vẫn hiểu ý bạn thôi, nhưng viết vậy đâm ra khỏ hiểu vì thiếu nhất quán.
& quan trọng mà mình hay gặp là trợ giúp đã 1 hồi lại bị trỡ mặt!
Hy vọng bạn hiểu ý mình và giúp mình nếu bạn biết, giúp là mình trân quý chứ trở mặt gì mình không hiếu ý ạ.
 
Lần chỉnh sửa cuối:
Bạn tách thành từng nhóm 2 chữ số, nếu thiếu thì thêm chữ số 0 bên trái cho đủ 16. Lập bảng tra các số từ 00 đến 99 (100 số) thành các ký tự tiếng Anh a-z, A-Z, 0-9 (62 ký tự) thêm 38 ký tự tiếng Việt có dấu vào là đủ 100.
 
Bạn tách thành từng nhóm 2 chữ số, nếu thiếu thì thêm chữ số 0 bên trái cho đủ 16. Lập bảng tra các số từ 00 đến 99 (100 số) thành các ký tự tiếng Anh a-z, A-Z, 0-9 (62 ký tự) thêm 38 ký tự tiếng Việt có dấu vào là đủ 100.
ý là sao ạ, anh có thể cho vào file excel được không ạ
 

File đính kèm

  • ma hoa.xlsx
    9.5 KB · Đọc: 4
@
Cảm ơn bạn, mình giải thích hơi lộm cộm, ý mình là làm sao để xử lý cái chuỗi số dài kia thành chuỗi ngắn hơn ( từ 5 đến 8 chữ số hoặc ký tự bất kỳ) miễn sao khi cần thì có thể giải ngược lại từ chuỗi 5-8 ký tự kia thành chuỗi dài ban đầu là được ạ
Tìm hiểu mã Unicode , sẽ có cách ngắn, có thể 4 ký tự cũng thể hiện hết.
Nếu Excel có hàm Unichar, Unicode thì chỉ cần công thức cũng đủ mã hóa
 
@

Tìm hiểu mã Unicode , sẽ có cách ngắn, có thể 4 ký tự cũng thể hiện hết.
Nếu Excel có hàm Unichar, Unicode thì chỉ cần công thức cũng đủ mã hóa
Nếu mã hóa bằng Unicode thì mình sợ khi gõ ngược lại là có ký tự không gõ được bằng tay mà phải dùng unicode để chuyển ngược lại
 
Nếu mã hóa bằng Unicode thì mình sợ khi gõ ngược lại là có ký tự không gõ được bằng tay mà phải dùng unicode để chuyển ngược lại
Vẫn có thể gõ, thông qua mã số nhé (nhưng đúng là bất tiện)
Đã mã hóa còn lo gõ lại thì mã hóa làm chi,
Nếu muốn gõ tay thì sử dụng giải pháp khác vậy..
Nhưng Mã hóa tốt nhất là dùng Scan cho Barcode, hoặc QRcode
 
khi gõ ngược lại là có ký tự không gõ được bằng tay
Bạn cho ví dụ đi.

Nên nhớ Quy luật tiến hóa của con người: Từ thô tới tinh.
Cụ thể: Từ thô sơ tới hiện đại, từ chính xác thấp tới siêu chính xác. Muốn tạo ra máy móc có độ chính xác thì phải từ từ tuần tự nâng dần nên, chúng ta không thể một đập ăn ngay được.
Còn ký tự chữ kia, bạn nghĩ ngược lại: Làm sao con người cho nó được vào máy tính? Mọi cái cũng đều do con người vẽ bằng đôi bàn tay đấy.
 
Ngoài ra bài này bị bí nữa là khi cắt chuỗi ra mới thấy có chuỗi số 0 đứng đầu dẫn tới không đúng ví dụ đoạn giữa cắt ra là 0001 thì nó hiểu là số 1 mất, bắt tay vào làm mới thấy khó nhai
 
Hai hàm này sẽ chuyển từ hệ thập phân sang hệ khác và ngược lại tùy vào khai báo hằng sBaseStr, sBaseStr = "01" là nhị phân, sBaseStr = "0123456789ABCDEF" là thập lục phân. sBaseStr càng dài thì kết quả sẽ càng ngắn.
Mã:
Const sBaseStr As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
Function NumToText(ByVal sNum As Variant) As String
Dim lChars As Long, lNewNum As Variant, i As Long
lChars = Len(sBaseStr)
Do Until sNum < lChars
    lNewNum = Int(sNum / lChars)
    NumToText = Mid(sBaseStr, (sNum - lNewNum * lChars) + 1, 1) & NumToText
    sNum = lNewNum
Loop
NumToText = Mid(sBaseStr, sNum + 1, 1) & NumToText
End Function
Function TextToNum(ByVal sText As String) As Variant
Dim lChars As Long, i As Long, k As Long
lChars = Len(sBaseStr)
For i = Len(sText) To 1 Step -1
    TextToNum = TextToNum + (InStr(sBaseStr, Mid(sText, i, 1)) - 1) * lChars ^ k
    k = k + 1
Next
End Function
 
Lần chỉnh sửa cuối:
Hai hàm này sẽ chuyển từ hệ thập phân sang hệ khác và ngược lại tùy vào khai báo hằng sBaseStr, sBaseStr = "01" là nhị phân, sBaseStr = "0123456789ABCDEF" là thập lục phân. sBaseStr càng dài thì kết quả sẽ càng ngắn.
Mã:
Const sBaseStr As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
Function NumToText(ByVal sNum As Variant) As String
Dim lChars As Long, lNewNum As Variant, i As Long
lChars = Len(sBaseStr)
Do Until sNum < lChars
    lNewNum = Int(sNum / lChars)
    NumToText = Mid(sBaseStr, (sNum - lNewNum * lChars) + 1, 1) & NumToText
    sNum = lNewNum
Loop
NumToText = Mid(sBaseStr, sNum + 1, 1) & NumToText
End Function
Function TextToNum(ByVal sText As String) As Variant
Dim lChars As Long, i As Long, k As Long
lChars = Len(sBaseStr)
For i = Len(sText) To 1 Step -1
    TextToNum = TextToNum + (InStr(sBaseStr, Mid(sText, i, 1)) - 1) * lChars ^ k
    k = k + 1
Next
End Function
bạn ơi, cái này dùng làm sao vậy ạ, giúp mình cho vào file kèm được không. đầu vào đầu ra gõ chỗ nào ạ,
 

File đính kèm

  • ma hoa.xlsx
    10.4 KB · Đọc: 3
Hàm dưới đây không tổng quát như của @huuthang_bd.
(Do yêu cầu mã có thể dài 16 ký số nên khi giải mã hàm @huuthang_bd có thể bị sai những số cuối)

1621680375297.png

PHP:
Function MaHoa(MNum As Variant) As String
Dim Rs As String, Tmp As Variant, TmpNum As Variant, Divid As Variant
TmpNum = MNum
Do
    Divid = Int(TmpNum / 62)
    Tmp = TmpNum - Divid * 62
    Select Case Tmp
        Case Is < 10
            Rs = Tmp & Rs
        Case Is < 36
            Rs = ChrW(Tmp - 9 + 64) & Rs
        Case Else
            Rs = Chr(Tmp - 35 + 96) & Rs
    End Select
    TmpNum = (TmpNum - Tmp) / 62
Loop Until TmpNum = 0
 MaHoa = Rs
End Function
    '_________________'
Function Giaima(MStr As String) As String
Dim Tmp As String, Rs As LongLong
For i = Len(MStr) To 1 Step -1
    Tmp = Mid(MStr, i, 1)
    Select Case Tmp
        Case 0 To 9
            Rs = Rs + Val(Tmp) * 62 ^ (Len(MStr) - i)
        Case "a" To "z"
            Rs = Rs + (35 + Asc(Tmp) - 96) * 62 ^ (Len(MStr) - i)
        Case "A" To "Z"
            Rs = Rs + (9 + Asc(Tmp) - 64) * 62 ^ (Len(MStr) - i)
    End Select
Next
Giaima = Rs
End Function
 
Hay quá ạ, có thể gắn file excel em kèm lên được không ạ, em không biết phải nhúng và chạy cái đoạn code trên như thế nào ạ, có phải tạo cái nút " mã hóa - giải mã" gì không hay là nó tự chạy ạ
 

File đính kèm

  • ma hoa.xlsx
    10.4 KB · Đọc: 2
Web KT
Back
Top Bottom