Avatar billede Droa Seniormester
06. maj 2013 - 13:44 Der 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? :)
Avatar billede claes57 Ekspert
06. maj 2013 - 14:45 #1
longDato = CLng(mid(bytearray,4,7))
Avatar billede arne_v Ekspert
06. maj 2013 - 15:17 #2
Jeg kan kun taenke paa den trivielle loesning:

        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)
Avatar billede arne_v Ekspert
06. maj 2013 - 15:18 #3
Jeg kan muligvis bixe noget smart senere (jeg har noget kode paa lageret, som maaske kan bruges til noget).
Avatar billede Droa Seniormester
07. maj 2013 - 10:12 #4
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 :)
Avatar billede Droa Seniormester
07. maj 2013 - 11:24 #5
jeg får denne fejl...

"Den aritmetiske handling udløste et overløb"

efter hvad jeg kan forstå, er det når tallet er større end hvad variablen kan klare?
Avatar billede arne_v Ekspert
08. maj 2013 - 03:30 #6
Raekkefoelgden er vel bare et little vs big endian problem.
Avatar billede arne_v Ekspert
08. maj 2013 - 03:33 #7
Som ordnes ved at hentes bytes i en anden raekkefoelge.
Avatar billede arne_v Ekspert
08. maj 2013 - 03:33 #8
Koden i #2 boer ikke kunne give overflow (med 7 bytes).
Avatar billede arne_v Ekspert
08. maj 2013 - 04:32 #9
Jeg arbejder stadig paa den elegante loesning.
Avatar billede Droa Seniormester
08. maj 2013 - 09:01 #10
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?
Avatar billede arne_v Ekspert
09. maj 2013 - 03:48 #11
Den fejl forstaar jeg ikke.

Long er 64 bit i VB.NET uanset 32 eller 64 bit Windows.
Avatar billede arne_v Ekspert
09. maj 2013 - 03:48 #12
Her er mine "paene" loesning:


Imports System
Imports System.IO

Imports Vajhoej.Record

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
Avatar billede Droa Seniormester
09. maj 2013 - 12:54 #13
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?
Avatar billede arne_v Ekspert
09. maj 2013 - 15:07 #14
Ja - .NET attributes virker ligesom Java annotations.

Og  Vajhoej.Record.StructReader bruger denmeta information til at laese med.
Avatar billede Droa Seniormester
09. maj 2013 - 15:40 #15
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 :)
Avatar billede arne_v Ekspert
09. maj 2013 - 15:50 #16
Vajhoej.Record.StructReader har ret mange linier.

:-)

Men du laeser paa samme maade uanset hvormange og hvilke data felter der skal laeses.Read metoden finder ud af det.
Avatar billede Droa Seniormester
09. maj 2013 - 17:18 #17
nogen chance for jeg kan se den klasse? den lyder ret spændende
jeg tror os jeg skylder dig nogen point, hvis du lægger et svar
Avatar billede arne_v Ekspert
09. maj 2013 - 18:44 #18
http://www.vajhoej.dk/arne/opensource/nrecord/

har version 1.0 som understoetter alle de normale INT1, INT2, INT4, INT8, FP4, FP8, FIXSTR, VARSTR.

Ovenstaaende med INTX og REMSTR er ikke i 1.0 men er i naeste version (jeg har opfundet dem til denne lejlighed).

Jeg kunne maaske uploade en 1.1 beta version med de to.
Avatar billede Droa Seniormester
09. maj 2013 - 19:26 #19
de er i C#, skal jeg så ikke bruge et Interface til at kunne bruge dem i et VB.NET Projekt?
Avatar billede arne_v Ekspert
09. maj 2013 - 19:44 #20
Nej.

Du laver bare ref til DLL og bruger dem i VB.NET - dokumentationen er nok C# centric, men indlaeg #12 har jo et VB.NET eksempel.
Avatar billede Droa Seniormester
09. maj 2013 - 19:49 #21
Så det betyder jeg altid kan bruge C# Dll filer til VB.NET?

når men du fortjener de point nu, hvis du lægger et svar :)
Avatar billede arne_v Ekspert
09. maj 2013 - 19:53 #22
Ja.

En DLL er ikke en C# DLL eller en VB.NET DLL men en .NET DLL.

Man kan saagar med lidt fingersnille lave en DLL som delvist er lavet fra C# og delvist fra VB.NET!
Avatar billede arne_v Ekspert
09. maj 2013 - 19:53 #23
svar
Avatar billede Droa Seniormester
09. maj 2013 - 19:58 #24
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 :)
Avatar billede arne_v Ekspert
09. maj 2013 - 20:27 #25
Jeg vil forsoege at uploade en beta version med INTX og REMSTR support i aften eller imorgen.
Avatar billede Droa Seniormester
09. maj 2013 - 21:06 #26
det ville jeg se frem til
Avatar billede arne_v Ekspert
12. maj 2013 - 04:31 #27
Uploadet som snapshot.
Avatar billede arne_v Ekspert
12. maj 2013 - 04:33 #28
Bin brug:

1) udpak bin zip
2) saet ref til record.dll
3) skriv din kode

Src brug:

1) udpak src zip
2) byg
3) saet ref til record.dll
4) skriv din kode
Avatar billede arne_v Ekspert
12. maj 2013 - 04:33 #29
Der er dokumentation i CHM filen.
Avatar billede Droa Seniormester
13. maj 2013 - 12:38 #30
perfekt! så kunne det ikke blive nemmere for mig :)
du skal have super mange tak fordi du gav den tid at skrive den kode!

Jeg har ikke haft tid at kigge src igennem, som jeg helt sikkert skal i aften :)
Avatar billede arne_v Ekspert
13. maj 2013 - 16:11 #31
INTX og REMSTR er lavet til dig.

Men resten er jo lavet til andre formaal.
Avatar billede Droa Seniormester
15. maj 2013 - 12:28 #32
har lige brugt 12 timer på at kigge dine src igennem, glemte næsten helt at trække vejret.. det er godt nok spændene :)

er helt vild med brugen af annotations, til at angive hvordan et objekt skal læses, har jeg aldrig selv lært at kunne.
Avatar billede arne_v Ekspert
20. maj 2013 - 02:47 #33
Jeg har faktisk en del arbejde med record/nrecord.

Jeg har tilfoejet INTX og REMSTR i nrecord (.NET versionen) til dig.

Jeg har tilfoejet nogle andre rettelser (mest omkring mere sofistikeret brug af length provider) i record (Java versionen).

Nu skal jeg have begge rettelser krydsporteret for at komem til version 1.1.
Avatar billede arne_v Ekspert
06. juni 2013 - 03:40 #34
Version 1.1 er uploadet.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester