Та же версия, что и у Питера О., но в VB.NET
Public Shared Function ToBcd(ByVal pValue As Integer) As Byte()
If pValue < 0 OrElse pValue > 99999999 Then Throw New ArgumentOutOfRangeException("value")
Dim ret As Byte() = New Byte(3) {} 'All bytes are init with 0's
For i As Integer = 0 To 3
ret(i) = CByte(pValue Mod 10)
pValue = Math.Floor(pValue / 10.0)
ret(i) = ret(i) Or CByte((pValue Mod 10) << 4)
pValue = Math.Floor(pValue / 10.0)
If pValue = 0 Then Exit For
Next
Return ret
End Function
Хитрость в том, чтобы понять, что простое использование pValue / = 10 округляет значение, поэтому, если, например, аргумент равен «16», первая часть байта будет правильной, но результат деления 2 (как 1.6 будет округлено). Поэтому я использую метод Math.Floor.