Italian conversioni che passione

fabero

Member
Licensed User
Longtime User
Sempre cercando di rinfrescarmi la memoria, sto incontrando difficoltà con le conversioni e chiedo aiuto per capire come approcciarmi al problema.
Campo textfield dove l'utente inserisce un codice, sulla carta esadeciamale lungo da 8 a 14 caratteri.
Questo codice lo devo a seconda della lunghezza trattare diversamente.
Sostanzialmente però è sempre una serie di "substring" e conversioni da HEX a decimale, e poi un possibile "riassemblaggio" della stringa e nuovamente una conversioone in qualche altra base.

Lurkando un po' sembra che la soluzione ai miei problemi venga dalla libreria ByteConverter.. Però dagli esempi e documentazione invece mi sembra una strada sbagliata..
Any Tips? ah no è il forum italiano.. Idee?? :D
 

sirjo66

Well-Known Member
Licensed User
Longtime User
secondo me devi usare ByteConverter, se ci mostri un esempio più pratico possiamo esserti più di aiuto
 

fabero

Member
Licensed User
Longtime User
Valore di ingresso per esempio ABCD1234, in questo caso, devo prendere per esempio le coppie: AB CD 12 34, dopodichè ribaltare il tutto 34 12 CD AB, riassemblare 3412CDAB e convertire per esempio in decimale.
Oppure
Valore di ingresso per esempio ABCD1234FFFF, in questo caso, devo prendere per esempio a gruppi: AB CD1234 FFFF, dopodichè ribaldare il tutto FFFF CD1234 AB, convertire in decimale i 3 gruppi, e poi assemblare ogni gruppo.
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Longtime User
..... e dov'è il problema ???
prima di tutto fai un IF (o un SELECT CASE) per dividere i due casi, se la stringa è lunga 8 caratteri oppure se è lunga 12 caratteri.
Se è lunga 8 caratteri, con dei substring la dividi, poi la riassemble invertita e poi la converti.

Non vedo il problema, se butti giù un po' di codice lo vediamo insieme e lo correggiamo
 

fabero

Member
Licensed User
Longtime User
..... e dov'è il problema ???
prima di tutto fai un IF (o un SELECT CASE) per dividere i due casi, se la stringa è lunga 8 caratteri oppure se è lunga 12 caratteri.
Se è lunga 8 caratteri, con dei substring la dividi, poi la riassemble invertita e poi la converti.

Non vedo il problema, se butti giù un po' di codice lo vediamo insieme e lo correggiamo
Io si, perchè se io elaboro la stringa, poi ho un esadecimale in un primo caso ad esempio ABCD1234 se devo convertirlo, e poi rimandarlo in un textfield di uscita come faccio?
HexToBytes e StringFromBytes ? Il primo alla compilazione si arrabbia dicendo:

src\b4j\example\main.java:254: error: incompatible types: byte[] cannot be converted to byte
_mifare_reverse_byte = (byte)(_bc.HexToBytes("0xabcd1234"));
 

sirjo66

Well-Known Member
Licensed User
Longtime User
ora purtroppo non ho il tempo per fare una prova, ma tu hai provato con bc.HexToBytes("abcd1234") ??
 

fabero

Member
Licensed User
Longtime User
In più modi:
Parte comune
Dim BC As ByteConverter
Dim Reverse_Byte As Byte

poi
Reverse_Byte = BC.HexToBytes("abcd1234")
oppure
Reverse_Byte = BC.HexToBytes("ABCD1234")
oppure
Reverse_Byte = BC.HexToBytes("0xabcd1234")
oppure
Reverse_Byte = BC.HexToBytes("0xABCD1234")
oppure
Dim Dritto As String
Dritto = valore string calcolato
Reverse_Byte = BC.HexToBytes(Dritto)
oppure
Dim Dritto As String
Dritto = valore string calcolato
Reverse_Byte = BC.HexToBytes("0x" & Dritto)
 

udg

Expert
Licensed User
Longtime User
Che io ricordi hexToBytes ritorna un array di byte non la conversione esadecimale-decimale
 

fabero

Member
Licensed User
Longtime User
Le parenti! :D Cazz! se non le evidenziavi col ciufolo che notavo che mancavano!
 

fabero

Member
Licensed User
Longtime User
Parenti = serpenti :)

Già.. ma ora mi trovo davanti ad un altro aspetto, la conversione in decimale,
se faccio ad esempio

Dim x as Long oppure String
x = Bit.ParseInt("FFFFFFFF", 16)

Il valore atteso sarebbe 4294967295 e invece...

java.lang.NumberFormatException: For input string: "FFFFFFFF"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:583)
at anywheresoftware.b4a.keywords.Bit.ParseInt(Bit.java:86)
at technofab.mifaredecoder.main._decodebadge(main.java:258)
at technofab.mifaredecoder.main._decode_click(main.java:155)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

.......................


Se invece uso una formula tipo:
bc.IntsFromBytes(bc.HexToBytes("FFFFFFFF"))(0))

ottengo -1

Su C# tale numero sarebbe un "int64" se non ricordo male...
 
Last edited:

udg

Expert
Licensed User
Longtime User
Quel valore è troppo grande per un INT . Prova con:
B4X:
Dim myvalue As Long = ParseLong( "FFFFFFFF",16)
Log(myvalue)

Sub ParseLong(Number As String, Radix As Int) As Long
   Dim jo As JavaObject
   jo.InitializeStatic("java.lang.Long")
   Return jo.RunMethod("parseLong", Array As Object(Number, Radix))
End Sub
 
Top