TizzyT

Myra24 / Xyra24 -TizzyT

Dec 9th, 2017
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 2.64 KB | None | 0 0
  1. 'Custom 24bit(3bytes) checksum algorithm by TizzyT, based on Adler32.
  2. Public Class Myra24
  3.     Const FlipBits As Byte = 170
  4.     Public Shared Function Sum(ByVal Data() As Byte) As Integer
  5.         Dim A As UShort = 1
  6.         Dim T As UShort = 0
  7.         Dim B As Integer = 0
  8.         Dim Stage As Integer = 0
  9.         For i = 0 To Data.Length - 1
  10.             Select Case Stage
  11.                 Case 0
  12.                     T = CUShort(Data(i) Xor FlipBits) << 4
  13.                     Stage = 1
  14.                     If B > 2147471361 Then B = B Mod 2147471362
  15.                 Case 1
  16.                     T = ((Data(i) Xor FlipBits) >> 4) Or T
  17.                     A = (A + T) Mod 4096
  18.                     B += A
  19.                     T = CUShort((Data(i) Xor FlipBits) << 4) << 4
  20.                     Stage = 2
  21.                 Case 2
  22.                     T = T Or (Data(i) Xor FlipBits)
  23.                     A = (A + T) Mod 4096
  24.                     B += A
  25.                     Stage = 0
  26.             End Select
  27.         Next
  28.         If Stage <> 0 Then
  29.             A = (A + T) Mod 4096
  30.             B += A
  31.         End If
  32.         Return ((B Mod 4096) << 12) Or A
  33.     End Function
  34.     Public Shared Function GetBytes(ByVal Data() As Byte) As Byte()
  35.         Dim bytes As Byte() = BitConverter.GetBytes(Sum(Data))
  36.         Return {bytes(0), bytes(1), bytes(2)}
  37.     End Function
  38. End Class
  39.  
  40. 'This is a version that swaps out most of the Mod operators for Xor operators for a little bit more speed. It doesn't pass the appended zeros test.
  41. Public Class Xyra24
  42.     Public Shared Function GetBytes(ByVal Data() As Byte) As Byte()
  43.         Dim bytes As Byte() = BitConverter.GetBytes(Sum(Data))
  44.         Return {bytes(0), bytes(1), bytes(2)}
  45.     End Function
  46.     Public Shared Function Sum(ByVal Data() As Byte) As Integer
  47.         Dim A As UShort = 1
  48.         Dim T As UShort = 0
  49.         Dim B As Integer = 0
  50.         Dim Stage As Integer = 0
  51.         For i = 0 To Data.Length - 1
  52.             Select Case Stage
  53.                 Case 0
  54.                     T = CUShort(Data(i)) << 4
  55.                     Stage = 1
  56.                     If B > 2147471361 Then B = B Mod 2147471362
  57.                 Case 1
  58.                     T = CUShort(Data(i)) >> 4 Or T
  59.                     A = A Xor T
  60.                     B += A
  61.                     T = CUShort(Data(i) << 4) << 4
  62.                     Stage = 2
  63.                 Case 2
  64.                     T = T Or Data(i)
  65.                     A = A Xor T
  66.                     B += A
  67.                     Stage = 0
  68.             End Select
  69.         Next
  70.         A = A Xor T
  71.         B += A
  72.         Return ((B Mod 4096) << 12) Or A
  73.     End Function
  74. End Class
Advertisement
Add Comment
Please, Sign In to add comment