Italian Fondere due Array di Byte

Star-Dust

Expert
Licensed User
Io ho due Array di Byte (o più) e dovrei fonderlo in uno solo

B4X:
Dim A() As Byte = Array As Byte(23,45,67)
Dim B() As Byte = Array As Byte(223,1,70)
  
Dim c() As Byte
  
c= A & B ' Come si può fare?
' C = (23,45,67,223,1,70)

Come si può fare?
 

udg

Expert
Licensed User
Longtime User
ByteConverter dovrebbe avere un metodo per la copia di un array. Dai un'occhiata.
 

Star-Dust

Expert
Licensed User
Sto lavorando alla Stampa via Bluetooth e devo inviare i dati in array di Byte.
Molti dei dati sono testo mettendo tutte le stringhe insieme poi é facile convertirli in un Array di Byte

Nel Caso si un Immagine già io la ottengo in un Array di dati, non posso convertirla in stringa (nemmeno la conterrebbe) sommarla alla stringa che già posseggo e riconvertire tutto in Array di Byte. Non avrebbe senso.

Vorrei invece convertire la somma delle stringhe in Array di Byte e accodare l'array di Byte prodotta dall'immagine.

Ecco il mio problema
 

Star-Dust

Expert
Licensed User
ByteConverter dovrebbe avere un metodo per la copia di un array. Dai un'occhiata.
Mi pare ci sia, adesso provo se fa al caso mio.
 

udg

Expert
Licensed User
Longtime User
Ho controllato ora. ByteConverter.ArrayCopy(src, srcoffset, dest, destoffset, count).
Dovrebbe essere ciò che ti occorre per accodare in dest a partire da destoffset, count byte di src presi a partire da srcoffset.
Mi raccomando, array tutti dello stesso tipo.
 
Last edited:

Star-Dust

Expert
Licensed User
Sembra non funzioni. Perché il primo array é pieno (TB) e il secondo Array é vuoto (BufferByte) e mi genera un errore:


*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
bt_printer_addbuffer_writeline (B4A line: 125)
BC.ArrayCopy(TB,0,BufferByte,BufferByte.Length,TB.Length)
java.lang.ArrayIndexOutOfBoundsException: src.length=17 srcPos=0 dst.length=0 dstPos=0 length=17
at java.lang.System.arraycopy(Native Method)
at anywheresoftware.b4a.agraham.byteconverter.ByteConverter.ArrayCopy(ByteConverter.java:227)
at b4a.example.bt_printer._addbuffer_writeline(bt_printer.java:273)
at b4a.example.main._printer(main.java:500)
at b4a.example.main._activity_create(main.java:379)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:186)
at b4a.example.main.afterFirstLayout(main.java:102)
at b4a.example.main.access$000(main.java:17)
at b4a.example.main$WaitForLayout.run(main.java:80)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:153)
at android.app.ActivityThread.main(ActivityThread.java:5297)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
java.lang.ArrayIndexOutOfBoundsException: src.length=17 srcPos=0 dst.length=0 dstPos=0 length=17
 

udg

Expert
Licensed User
Longtime User
Length indica il numero di byte nell'array, ma l'indice parte da zero...
Prova
BC.ArrayCopy(TB,0,BufferByte,BufferByte.Length-1,TB.Length)
Se Buffer è vuoto parti da zero. In ogni caso assicurati che Buffer sia abbastanza grande da poter ricevere TB e poi i nuovi dati.
 
Last edited:

Star-Dust

Expert
Licensed User
Ok. Grazie farò un tentativo nel pomeriggio.
Ho dichiarato
Buffer() ad Bye

Credo di la prima volta dovrebbe funzionare, ma il problema che dovrò fare passaggi successivi per aggiungere nel buffer altre liste , e non so se buffer verrà esteso.

Sospeso che dopo la prima operazione avrà una dimensione già prefissata e non si potrà estendere
 

Star-Dust

Expert
Licensed User
Mi spiace ma non funziona.
B4X:
BC.ArrayCopy(B,0,BufferByte,BufferByte.Length-1,B.Length)
Logger connesso a: 0123456789ABCDEF
--------- beginning of /dev/log/system
--------- beginning of /dev/log/main
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
bt_printer_addbuffer_writeline (B4A line: 124)
BC.ArrayCopy(B,0,BufferByte,BufferByte.Length-1,B
java.lang.ArrayIndexOutOfBoundsException: src.length=17 srcPos=0 dst.length=0 dstPos=-1 length=17
at java.lang.System.arraycopy(Native Method)
at anywheresoftware.b4a.agraham.byteconverter.ByteConverter.ArrayCopy(ByteConverter.java:227)
at b4a.example.bt_printer._addbuffer_writeline(bt_printer.java:262)
at b4a.example.main._printer(main.java:500)
at b4a.example.main._activity_create(main.java:379)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:186)
at b4a.example.main.afterFirstLayout(main.java:102)
at b4a.example.main.access$000(main.java:17)
at b4a.example.main$WaitForLayout.run(main.java:80)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:153)
at android.app.ActivityThread.main(ActivityThread.java:5297)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
 

Star-Dust

Expert
Licensed User
Copio qui il suggerimento che ho ricevuto, che si basa anche su un idea di UDG

B4X:
BufferByte=Merge(BufferByte,Text.GetBytes(mEncoding))

private Sub Merge(Array1() As Byte, Array2() As Byte) As Object
    Private BC As ByteConverter
    Dim ByteArray(Array1.Length + Array2.Length) As Byte
   
    BC.ArrayCopy(Array1,0,ByteArray,0,Array1.Length)
    BC.ArrayCopy(Array2,0,ByteArray,Array1.Length,Array2.Length)
    Return ByteArray
End Sub
 

Star-Dust

Expert
Licensed User
a questo punto azzardo un altra soluzione... era semplice e non ci ero arrivato.
Visto che il problema di creare un Array non definito non si pone (era il punto in cui mi fermavo), basta definire l'array ricevente grande quanto la somma degli altri due:

B4X:
private Sub Merge(Array1() As Byte, Array2() As Byte) As Object
    Dim ByteArray(Array1.Length + Array2.Length) As Byte
    For i=0 To Array1.Length-1
           ByteArray(i)=Array1(i)
    Next
 
    For i=0 To Array2.Length-1
        ByteArray(Array1.Length+i)=Array2(i)
    Next
 
    Return ByteArray
End Sub

Cosi non é necessario usare una libreria esterna. Si può anche usare una List, aggiungere tutto nella lista.
Poi creare una Array grande quanto la List e assegnare a ogni valore i valori della lista... ma troppo tempo...
 
Last edited:

Star-Dust

Expert
Licensed User
La prossima volta manda in privato
 

udg

Expert
Licensed User
Longtime User
Hai provato una comparazione di efficienza tra le due soluzioni?
Ovviamente su un unico merge di pochi byte non credo si veda nulla, ma se provi in loop un migliaio di merge o se gi array di partenza sono corposi si notano differenze apprezzabili tra le due soluzioni? Giusto per curiosità (anche io non sono un fun dell'impiego di tante librerie)
 

Star-Dust

Expert
Licensed User
Devo provare, nel mio caso non sono array grandissimi. Mi serve per la stampa in Bluetooth, quindi passare del testo in area di byte e un piccolo logo
 

LucaMs

Expert
Licensed User
Longtime User
Sono sincero, è la soluzione che avrei proposto io se non avessi i messaggi bloccati (senza motivo)
Siine felice (riuscirà Google a tradurre "Siine"? Non ci riuscirebbero nemmeno tanti italiani :p).

Tutto tempo risparmiato!
 

Star-Dust

Expert
Licensed User
Si può scrivere "essine felice"
 

Star-Dust

Expert
Licensed User
Non è esattamente uguale
 

LucaMs

Expert
Licensed User
Longtime User
Beh, non è stato accettato il mio commento, espresso con un video di Youtube, un piccolo brano da un film di Nanni Moretti, "Palombella rossa", in cui lui dice che le parole sono importanti, schiaffeggiando colei che lo sta intervistando, perché usa inglesismi e frasi fatte. Peccato :). Basta che cerchiate "le parole sono importanti" - video.

(chiaramente, "essine felice" era una battuta... spero :p).
 
Top