06. maj 2013 - 13:44Der er
33 kommentarer og 1 løsning
7 Byte() til en Integer
Hej eksperter
Jeg sidder og prøver at modtage en lidt underlig UDP pakke.
my bytearray mønster er nogenlunde sådan her
0-3 = Pakkenummer 4-10 = unixtime dato 11-32 = null 33-slut = text
Jeg er ikke helt sikker på at de ser så firkantet ud som dette, da jeg stadig prøver at finde mønstret i pakkerne.
men det ser ud til at 4-10 er unix time
jeg prøver at få lagt det ud i en long eller integer... men jeg har ikke helt nogen ide om hvordan man renger pakkerne sammen, så man får det rigtige tal... nogen der kunne give lidt hjælp? :)
Dim b() As Byte = { 1, 2, 3, 4, 5, 6, 7 } Dim res As Long ' let us assume little endian res = CType(b(0),Long) _ Or (CType(b(1), long) << 8) _ Or (CType(b(2), Long) << 16) _ Or (CType(b(3),Long) << 24) _ Or (CType(b(4),Long) << 32) _ Or (CType(b(5),Long) << 40) _ Or (CType(b(6),long) << 48)
det som jeg kan se ude fra pakken er at den køre modsat rækkefølge en en normal integer.
1. 2. 3. 4. (Normal rækkefølge)
4. 3. 2. 1. (Pakkes rækkefølge)
den gør det samme igen med datoen, som virker lidt underligt.. men har prøvet at lege med din kode, som gav mig et ret godt indblik i hvordan det skete :)
Af en eller anden grund giver den et overflow på alt større end 32bit, selv med en Long, når jeg kommentere de andre ud, giver den ingen fejl.. er det noget at gøre med jeg køre Studio i 32bit? Det burde det vel ikke, siden en Long godt kunne klare begge dele?
Namespace May1 ' * 0-3 = Pakkenummer ' * 4-10 = unixtime dato ' * 11-32 = null ' * 33-slut = text <Struct(Endianess := Endian.BIG)> _ Public Class Package <StructField(N := 0, Type := FieldType.INT4)> _ Private packno As Integer <StructField(N := 1, Type := FieldType.INTX, Length := 7)> _ Private unixtim As ULong <ArrayField(Elements := 22)> _ <StructField(N := 2, Type := FieldType.UINT1)> _ Private filler As Byte() = New Byte(21) {} <StructField(N := 3, Type := FieldType.REMSTR, Encoding := "ISO-8859-1")> _ Private txt As [String] Public ReadOnly Property PackageNumber() As Integer Get Return packno End Get End Property Public ReadOnly Property UnixTimestamp() As ULong Get Return unixtim End Get End Property Public ReadOnly Property Text() As [String] Get Return txt End Get End Property End Class Public Class Program Public Shared Sub Main(args As String()) Dim b As Byte() = { 0, 0, 0, 1, _ 1, 2, 3, 4, 5, 6, 7, _ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _ 65, 66, 67 } Dim sr As New StructReader(b) Dim o As Package = sr.Read(Of Package)(GetType(Package)) Console.WriteLine(o.PackageNumber & " " & o.UnixTimestamp.ToString("X") & " " & o.Text) Console.ReadKey() End Sub End Class End Namespace
arne_v din kode ser utroligt spændende ud, desværre har jeg slet ikke været hele vejen rundt om VB.Net syntax endnu, så jeg forstår kun hvad det gør, men vil ikke kunne forstå den, uden jeg først forstår dit syntax brug.
<StructField(N := 3, Type := FieldType.REMSTR, Encoding := "ISO-8859-1")>
jeg har søgt og søgt omkring hvad det lige er, siden jeg aldrig har set det før.. det ligner lidt kompiler kommandoer, også alligevel ikke, da det jo mere er forklaringer til objectet StructReaders, omkring hvordan den skal omdanne dataen.
Har jeg ret, hvis jeg siger det er det samme som java annotations?
Det virker faktisk som en super god ide, lyder til den er ret generisk.. men det betyder vel os, at det vigtigste ligger i Vajhoej.Record.StructReader?
men du bruger vel bare forskellige methoder, ud fra hvad du fodre den med?
hvis du f.eks Angiver den skal bruge INT4 eller INTX, ville det f.eks bruge din CType sætning, og hvis det er REMSTR, vil den bruge en passende Encoder?
Giver mig helt lysten til at læse op på hvordan de .Net attributes virker, da jeg aldrig rigtigt har kunne finde nogen god undskyldning for dem i java endnu, da jeg kun stødder på de, i Frameworks :)
mange tak for hjælpe, du har været en stor hjælp som altid, vil da helt sikkert læse mere på din kode, du virker til at vide en del om bytes og sockets :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.