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)
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.
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.
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
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.
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
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)
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
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...
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)
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 ).