German AStreams... mit Bytes >127

ewatv

Member
Licensed User
Lieber Leser, anbei ein kurzes Programm (B4A) mit dem ich die per Socket einlaufenden Bytefolgen in einer "List" zur weiteren Bewertung speichere.
Diese Bytefolgen (mit maximal 50 Bytes) werden auch korrekt in die List1 geschrieben - allerdings nur solange kein Byte > 127 dabei ist.
Da eine typische Bytefolge in meiner Anwendung fast immer auch Bytes zwischen 128 und 255 aufweist (z.B 127 20 1 4 0 0 0 200 130 0 0 0 79 75 13 10) klappt es mit meinem "Primitiv-Programm" nicht mehr. Ich habe nach einer Alternative zu "BytesToString" gesucht aber nix gefunden.
Für einen Tipp zur Lösung dieses Problems wäre ich dankbar.
ewatv
 

Attachments

  • QIy_forum.zip
    7.2 KB · Views: 270

DonManfred

Expert
Licensed User
Longtime User
Guck mal, ob Dir das hilft?

Ansonsten ist es schwer deinen Code nachzuvollziehen, wenn man keine Adresse zum Connecten hat.

B4X:
Sub AStreams_NewData(Buffer() As Byte) As String
    Private msg As String
    Private bmsg() As Byte
    
    Dim Blob(Buffer.Length) As Byte
    Dim bc As ByteConverter
    bc.LittleEndian = True                                'convert to little endian
    bc.ArrayCopy(Buffer, 0, Blob, 0, Buffer.Length)
    
    
    List1.Clear
    
    msg=BytesToString(Blob,0,Blob.Length, ("UTF-8"))
    lblRX.Text = "Length:" & msg.Length
    
    bmsg = msg.GetBytes("UTF8")                    ' bytes > 127 ?????
    List1.AddAll(bmsg)

    lblBytes.Text = ""
    For i = 0 To List1.Size-1
        lblBytes.Text = lblBytes.Text & List1.Get(i) & " "
    Next

End Sub
 

ewatv

Member
Licensed User
Sub AStreams_NewData(Buffer() As Byte) As String
Private msg As String
Private bmsg() As Byte

Dim Blob(Buffer.Length) As Byte
Dim bc As ByteConverter
bc.LittleEndian = True 'convert to little endian
bc.ArrayCopy(Buffer, 0, Blob, 0, Buffer.Length)


List1.Clear

msg=BytesToString(Blob,0,Blob.Length, ("UTF-8"))
lblRX.Text = "Length:" & msg.Length

bmsg = msg.GetBytes("UTF8") ' bytes > 127 ?????
List1.AddAll(bmsg)

lblBytes.Text = ""
For i = 0 To List1.Size-1
lblBytes.Text = lblBytes.Text & List1.Get(i) & " "
Next

End Sub
Vielen Dank für die ultraschnelle Reaktion. Werd' es heute noch ausprobieren. Falls es nicht klappen sollte - ich hab' einen Server hier, mit dem ich beliebige Bytefolgen aussenden kann.
Servus
ewatv
 

ewatv

Member
Licensed User
.... ich habe mich gleich drangemacht -leider ohne Erfolg. Sobald ein Byte größer ist als 127 ist das Ergebnis unverändert falsch.
Aus 127 44 12 1 0 0 wird 127 44 12 1 0 0 korrekt (Length:6)
Aus 129 44 12 1 0 0 wird -17 -65 -67 44 12 1 0 0 falsch (Length:6)
Aus 127 wird 127 korrekt (Length:1)
Aus 128 wird -17 -65 -67 falsch (Length:1)
Aus 223 wird -17 -65 -67 falsch (Length:1)
Die Length stimmt immer .
Wie schon erwähnt habe ich hier einen Server mit meiner DSL IP, in den ich beliebige Daten seriell eingeben kann. Die Hardware ist ein LAN/seriell Wandler (WIZnet125 ).
Falls gewünscht kannst Du Dich gerne bei mir einklinken (Skype habe ich natürlich auch).
Einen schönen Abend noch
ewatv
 

thetahsk

Active Member
Licensed User
Longtime User
Die Bytes sind doch signed, d.h -127 bis 127. Versuch mal die Funktion ToUnsigned hier

oder direkt
 
Last edited:

ewatv

Member
Licensed User
Ich werf' das Handtuch! Ich habe alles durchprobiert, was so an kleinen und größeren Tipps hereingekommen ist.
Sobald ein Byte >127 ist kommt alles aus dem Tritt:
Aus 127 44 12 1 0 0 wird 127 44 12 1 0 0 OK
Aus 129 44 12 1 0 0 wird -17 -65 -67 44 12 1 0 0 falsch
Aus 190 44 12 128 13 14 wird -17 -65-67 44 12 -17 -65 -67 13 14 falsch
Aus 215 44 200 13 14 wird -17 -65 -67 44 -17 -65 -67 13 14 falsch

JEDES Byte >127 wird zu 3 Bytes mit den Werten -17 -65 -67

Ich kann zwar nicht glauben, daß es keinen Weg gibt - aber ich hab' ihn nicht gefunden.
Jedenfalls vielen Dank für die Tipps und Hinweise.
 

ewatv

Member
Licensed User
Guten Abend Manfred, ich habe 2 Möglichkeiten. Einmal die eigentliche Anwendung mit der Adresse: 84.150.65.114 mit Port 5020, wenn man da die Bytefolge
126 30 2 7 0 0 0 0 0 110 65 hinsendet, antwortet sie mit 192 1 86 48 49 69 0 0 079 75 13 10
Die zweite Möglichkeit (das ist mein experimenteller "setup") hat die Adresse wie vorher genannt, aber mit Port 5030.
Sobald Du da "connected" bist - was ich an einer LED erkenne - kann ich jede beliebige Bytefolge manuell vorgeben und senden.
Ideal wäre es wenn wir auch auf Skype verbunden wären (ernst_weber_skype).
Vorab schon mal herzlichen Dank für Dein Engagement und Hilfsbereitschaft Manfred.
Bis bald
ewatv / Ernst
 

ewatv

Member
Licensed User
... die zweite Zeile muß ich korrigieren .....antwortet sie mit 192 1 86 48 49 69 69 0 0 0 79 75 13 10
 
Last edited:

DonManfred

Expert
Licensed User
Longtime User
Die Bytes die da zurückkommen. Machen die als STRING "Sinn"?

Das hier ist die Antwort, die ich auf die erste Adresse bekomme. Als HEX: C00156303145450000004F4B0D0A

B4X:
Sub AStreams_NewData(Buffer() As Byte) As String
    Private msg As String
    Private bmsg() As Byte
    Dim newBuffer(Buffer.Length) As Byte
    For i= 0 To Buffer.Length-1
        newBuffer(i) = ToUnsigned(Buffer(i))       
    Next
    Dim bc As ByteConverter
    Log(bc.HexFromBytes(newBuffer))

Bei der 2. Adresse bekomme ich keine Antwort. Also bei Port 5030
 

ewatv

Member
Licensed User
bei der 5030 habe ich die LED zu spät gesehen... probier's bitte nochmal. Die ersten hex werde ich mir gleich anschauen
bei 5030 kommt bei einem neuen connect 127 12 13 15 200
 

OliverA

Expert
Licensed User
Longtime User
Try
B4X:
Sub BytesToUnsignedString(bytes() As Byte) As String
    Dim sb As StringBuilder
    sb.Initialize
    Dim retVal As String
    If bytes.Length > 0 Then
        sb.Append(ToUnsigned(bytes(0)))
        For x = 1 To bytes.Length - 1
            sb.Append($", ${ToUnsigned(bytes(x))}"$)        
        Next
        retVal = sb.ToString
    End If
    Return retVal
End Sub

'https://www.b4x.com/android/forum/threads/signed-unsigned-bytes-confusion.61290/post-386721
Sub ToUnsigned(b As Byte) As Int
    Return Bit.And(0xFF, b)
End Sub
 
Top