Italian Convertire stringa in bytes

FreeWolF

Active Member
Licensed User
Longtime User
Ciao a tutti!

Devo comunicare con uno strumento elettronico, per fare ciò gli invio un array di bytes tramite Asyncstream e funziona tutto correttamente (risposta dello strumento inclusa).

Per fare ciò uso questo codice:

B4X:
Sub Server_NewConnection (Successful AsBoolean, NewSocket AsSocket)

AStreams.Initialize(Socket1.InputStream, Socket1.OutputStream, "AStreams")

If Successful Then
Socket1 = NewSocket

AStreams.write(ArrayAsByte(0x16, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x2C))
ToastMessageShow("Dati inviati",True)EndIf


Server.Listen

Ora, il problema è che io vorrei "personalizzare" la stringa che invio allo strumento.

La stringa che invio è: 0x16, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x2C ho provato a scivere questo:

B4X:
Sub Server_NewConnection (Successful AsBoolean, NewSocket AsSocket)

AStreams.Initialize(Socket1.InputStream, Socket1.OutputStream, "AStreams")

If Successful Then
Socket1 = NewSocket

Edittext1.text = "0x16, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x2C"

AStreams.write(Edittext1.text)

Ma così non funziona.

Ho anche provato a scrivere la stringa così:

B4X:
   AStreams.write(ArrayAsByte(Edittext1.text))

Ma non funziona nemmeno così.

Insomma, io dovrei prendere un valore scritto in decimale da una Edittext, convertirla da decimale a esadecimale, inserire il valore ottenuto aggiungendo magari "0x" davanti e metterlo nell'array di dati che vado ad inviare.

Avete qualche idea di come posso fare?

Grazie mille!!
 

FreeWolF

Active Member
Licensed User
Longtime User
Ho scritto questo codice:

B4X:
EditText1.Text = "0x16, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x2C"
  
   EditText2.Text = "22"
   EditText3.Text = "227"
   EditText4.Text = "44"
  
   Dim a,b,c As String
   a = Bit.ToHexString(EditText2.Text)
   b = Bit.ToHexString(EditText3.Text)
   c = Bit.ToHexString(EditText4.Text)
    
   EditText1.Text = a & " " & b & " " & c
  
   Dim a1,a2,a3 As String
  
   a1 = Bit.ParseInt(a,16)
   a2 = Bit.ParseInt(b,16)
   a3 = Bit.ParseInt(c,16)
  

   EditText5.Text = a1 & " " & a2 & " " & a3

Con questo metodo, posso convertire i dati esadecimali che spedisco allo strumento in integer che andrò a visualizzare nelle edittext e viceversa, da interi a esadecimali.

Ora, come faccio ad inserire i dati convertiti in esadecimale (o Bytes, sto facendo un pò di confusione) in questa stringa:


B4X:
AStreams.write(ArrayAsByte(0x16, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x2C))

?

Ci vuole anche lo "0x" davanti?
 

LucaMs

Expert
Licensed User
Longtime User
Partendo da questa: Edittext1.text = "0x16, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x2C"

questo DOVREBBE funzionare:
B4X:
Dim HexString() As String = Regex.Split(", ", Edittext1.text)
Dim arrByte(8) As Byte
For i = 0 To 7
    arrByte(i) = HexString(i)
Next
AStreams.write(arrByte)
 

FreeWolF

Active Member
Licensed User
Longtime User
Rieccomi :)

Purtroppo con l'esempio che mi hai scritto non funziona, ricevo il seguente errore:An Error has occured in sub: java.lang. NumberFormatException: Invalid hex double:0x01 Continue?
 
D

Deleted member 103

Guest
Ciao FreeWolF,

ho modificato un pò la routine di LucaMs.

Hai bisogno della libreria "ByteConverter"

B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

    Private conv As ByteConverter
End Sub

Sub Activity_Create(FirstTime As Boolean)
   
    Edittext1.text = "0x16, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x2C"

    Dim HexString() As String = Regex.Split(", ", Edittext1.text)
    Dim arrByte(HexString.Length) As Byte
    Dim b() As Byte
    For i = 0 To HexString.Length - 1
        b = conv.HexToBytes(HexString(i).SubString(2))
        arrByte(i) = b(0)
    Next
    AStreams.write(arrByte)

End Sub
 

FreeWolF

Active Member
Licensed User
Longtime User
Grazie per l'aiuto, tra dieci minuti provo e poi ti dico se funziona o meno. Potrebe darsi che riuscirò a non dover mettere gli "0x" davanti, ma per adesso se funziona tutto va bene così :)
 
D

Deleted member 103

Guest
Così sarebbe la funzione anche più elegante.
B4X:
Sub Activity_Create(FirstTime As Boolean)
   Edittext1.text = "0x16, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x2C"

   Dim HexString() As String = Regex.Split(",", Edittext1.text)
   Dim arrByte(HexString.Length) As Byte
   Dim b() As Byte
   For i = 0 To HexString.Length -1
    b = conv.HexToBytes(HexString(i).Trim.Replace("0x",""))
     arrByte(i) = b(0)
   Next
   AStreams.write(arrByte)
End Sub
 

FreeWolF

Active Member
Licensed User
Longtime User
Rimando la prova del tuo codice perchè naturalmente quando c'è fretta capitano sempre tutte, ora gli Ingenieri hanno aggiornato il software dello schedino Wifi e nonsi connette più...devo aspettare che risolvano.....

Comunque grazie mille di nuovo!!
 

FreeWolF

Active Member
Licensed User
Longtime User
OK, ho risolto tutto, ora funziona SENZA PROBLEMIIIIIIIIIIIIIII GRAZIEEEEEEEEEEEEEEEEEEEEEEEEE!!!!!


Vi devo una birra.

Chiedo solo l'ultima cosa, poi per un pò spero di non farmi più sentire per richieste di aiuto :)

Lo strumento risponde correttamente, però la risposta è un pò lenta e viene "spezzata" in due parti. Io naturalmente mi trovo solo la seconda parte. Come si fa per "aumentare" il tempo di attesa e di riempimento del buffer in entrata della funzione asyncstream?
 
Top