Author | Message | Time |
---|---|---|
-Drew- | heres my attempt at a packet debuffer class. my only question is this the most efficient usage? any suggestions or criticism are graciously accepted. [code] From clsPktDebuf Private Buffer As String Public Sub InitPacket(Data As String) Buffer = Data End Sub Public Function GetData(DType As DataType, Optional DataEnd As Integer) As Variant Select Case DType Case xDword GetData = CVL(Mid$(Buffer, 1, 4)) Call RemBytes(4) Case xWord GetData = CVI(Mid$(Buffer, 1, 2)) Call RemBytes(2) Case xbyte GetData = Chr(CVB(Mid$(Buffer, 1, 1))) Call RemBytes(1) Case xNonNtstring GetData = Mid$(Buffer, 1, DataEnd) Call RemBytes(Len(GetData)) Case xNTString GetData = Mid$(Buffer, 1, InStr(1, Buffer, Chr(0)) - 1) Call RemBytes(Len(GetData) + 1) End Select End Function Public Sub RemBytes(remLength As Integer) Buffer = Mid(Buffer, remLength + 1) End Sub Public Sub ClearBuf() Buffer = "" End Sub [/code] the CVI(), CVB(), and CVL() are just RtlMoveMemory functions | September 16, 2006, 6:22 PM |
l2k-Shadow | I would suggest you rather use a length variable instead of removing the bytes when debuffing, you never know when you have to go back in the buffer for something and your data will be gone. | September 16, 2006, 8:50 PM |
-Drew- | Okay, at first i didn't really care to do it that way. When i was redoing my 0x3E (SID_LOGONREALMEX) I decided that it was less of a headache if i did use a position instead of just removing the bytes as needed. Thanks Shadow, heres the new Class, any other suggestions? [code] ***ClsPktDebuf Private Buffer As String Private Position As Integer Public Sub InitPacket(Data As String) Position = 1 Buffer = Data End Sub Public Sub SetPosition(NewPos As Integer) Position = NewPos End Sub Public Sub SkipBytes(lSkip As Integer) Position = Position + lSkip End Sub Public Sub ClearBuf() Buffer = "" Position = 1 End Sub Public Function GetData(DType As DataType, Optional DataLen As Integer) As Variant Dim NTPos As Long On Error Resume Next Select Case DType Case xDword GetData = CVL(Mid$(Buffer, Position, 4)) Position = Position + 4 Case xWord GetData = CVI(Mid$(Buffer, Position, 2)) Position = Position + 2 Case xByte GetData = Chr(CVB(Mid$(Buffer, Position, 1))) Position = Position + 1 Case xNonNTString GetData = Mid$(Buffer, Position, DataLen) Position = Position + Len(GetData) Case xNTString NTPos = InStr(Position, Buffer, Chr(0)) GetData = Mid$(Buffer, Position, NTPos - Position) Position = NTPos + 1 End Select End Function [/code] | September 19, 2006, 12:56 AM |
rabbit | You should make GetDWORD, GetWORD, GetSTRING, GetBYTE, and GetBYTES, instead of clumping everything together. You should also never use On Error Resume Next. Either handle your errors or let the program crash. | September 19, 2006, 1:05 AM |
l2k-Shadow | [quote author=rabbit link=topic=15721.msg158423#msg158423 date=1158627940] You should make GetDWORD, GetWORD, GetSTRING, GetBYTE, and GetBYTES, instead of clumping everything together. You should also never use On Error Resume Next. Either handle your errors or let the program crash. [/quote] and try the very hardest to avoid using Variant as a data type, it is slow, and I promise you, it will bite you in the ass. Also if CVI() is returning an integer, it is incorrect, it should return a long. Remember that Visual Basic data types are signed, so therefore if (assuming you are on a 32-bit system) a WORD is 2 bytes, it's highest value is 0xFFFF, 65535, it is well above the value of a VB Integer, which's maximum value is 0x7FFF, 32767. | September 19, 2006, 1:13 AM |