Mảng byte thành số Long, BytesToLong

Liên hệ QC

truongvu317

Thành viên tích cực
Tham gia
15/11/10
Bài viết
943
Được thích
685
Giới tính
Nữ
1612604177989.png


Anh chị em giúp Vũ viết hàm BytesToLong với ạ, Sao cho khi chạy sub Text sẽ hiện hai thông báo, thống bao một là "80", thông bao thứ hai là "80000000". Vũ muốn viết một hàm để chuyển một mảng các byte thành một số Long. Vũ xin cảm ơn anh chị em!


Mã:
Option Explicit

Function BytesToLong(Mang, IsBig As Boolean) As Long

'???

End Function





Sub Text()
    Dim b(1 To 4)
    b(1) = &H80
    b(2) = 0
    b(3) = 0
    b(4) = 0
    
    MsgBox (Hex(BytesToLong(b, False)))
    MsgBox (Hex(BytesToLong(b, True)))
    
End Sub
 
Người khác chỉ hiểu đại khái bạn muốn gì. Và có khả năng là chính bạn cũng chỉ hiểu đại khái.
Nhưng "đại khái" không đủ để viết code. Cần nhiều diễn tả chi tiết hơn.

Muốn chi tiết hơn thì bạn phải tự làm cỡ chục cái ví dụ, nhiều trường hợp khác nhau mà bạn có thể nghĩ ra (*). Sau đó chọn cỡ ba bốn cái điển hình đưa lên đây làm ví dụ cho người khác hiểu.
(đừng quên là tối thiểu phải có một ví dụ số âm)

(*) nếu muốn đi sâu vào lập trình thì bạn phải luyện kỹ năng "tự nghĩ ra nhiều trường hợp". Đó là bí quyết căn bản để test code. Kỹ năng này không tự phát triển đâu mà nó phải do rèn luyện.
 
Lần chỉnh sửa cuối:
Upvote 0
đừng quên là tối thiểu phải có một ví dụ số âm
Vâng bác, giờ cháu mới để ý kỹ hơn, đây là một vài ví dụng.
BoB1b2b3IsBigReturn
0​
0​
0​
0​
*
0​
255​
255​
255​
255​
*
-1​
255​
0​
0​
0​
TRUE​
-16777216​
255​
0​
0​
0​
FALSE​
255​
0​
255​
0​
1​
TRUE​
16711681​
0​
255​
0​
1​
FALSE​
16842496​
128​
1​
2​
3​
TRUE​
-2147417597​
127​
0​
11​
22​
FALSE​
369819775​
 
Upvote 0
Bạn vẫn chưa có chỗ nào khẳng định rõ nhưng tôi nghĩ mảng truyền vào có đúng 4 bai.
Mã:
Function BytesToLong(mang() As Byte, ByVal isbig As Boolean) As Long
Dim k As Long, s As String
    For k = LBound(mang) To UBound(mang)
        If isbig Then
            s = s & Right("0" & Hex$(mang(k)), 2)
        Else
            s = s & Right("0" & Hex$(mang(5 - k)), 2)
        End If
    Next k
    s = "&H" & s
    BytesToLong = CLng(s)
End Function
 
Upvote 0
Function ToTiTe(ByVal a, ByVal big As Boolean) As Long
' hàm tính kết quả một mảng a 4 bytes thành số Long
' tham số big cho biết mảng a ở dạng big/little-endian
' chú ý: số âm là số có bit lớn nhất là 1, tức byte lớn nhất > 127
Dim aL, aU
aL = LBound(a)
aU = UBound(a)
If Not big Then
SwapVals a(aL), a(aU)
SwapVals a(aL + 1), a(aU - 1)
End If
ToTiTe = a(aL) And 127 ' lấy phần không âm của byte lớn nhất
For i = aL + 1 To aU
ToTiTe = ToTiTe * 256 + a(i)
Next i
If a(aL) And 128 Then ToTiTe = ToTiTe Or &H80000000 ' số âm
End Function

Function SwapVals(ByRef a, ByRef b)
' hàm chuyển đổi giá trị a và b
Dim tmp
tmp = a
a = b
b = tmp
End Function
 
Upvote 0
tôi nghĩ mảng truyền vào có đúng 4 bai.
Dạ đúng là mảng 4 byte, cháu thử code đúng như mong muốn rùi ạ, cách này mới lạ với cháu. Cảm ơn bác nhiều ạ.
Bài đã được tự động gộp:

Function ToTiTe(ByVal a, ByVal big As Boolean) As Long
Cháu thử đúng như ý muốn rùi ạ. Cảm ơn bác, pha xử lý số âm ngọt ngào quá, cháu cũng làm giống ý bác lúc đầu, mà khi gặp số âm thì toàn báo lỗi tràn số.
 
Upvote 0
Ở bài #5 tôi giải sát theo lý thuyết lưu trữ số, kể cả cách sắp bits và dạng 1/2-complement.

Trên thực tế, giải theo lối dùng hàm có sẵn của VBA như bài #4 vừa gọn vừa dễ chỉnh sửa hơn.

Tôi chỉ sửa như vầy để tránh con số 5:
If isbig Then
s = s & Right("0" & Hex$(mang(k)), 2)
Else
s = Right("0" & Hex$(mang(k)), 2) & s
End If
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom