Newsgroup: it.comp.lang.visual-basic
Titolo: Inversione di byte

Salve a tutti.
Ho un piccolo problema.
Devo rileggere un file costruito tramite unix i cui valori vengono
memorizzati al contrario (o se è il contrario Windows) nella forma
Byte4 Byte3 Byte2 Byte1
Leggo il dato in questione e lo devo riportare nella forma
Byte1 Byte2 Byte3 Byte4
Ho fatto una piccola subroutine alla quale viene passata la variabile da
modificare, all'uscita della quale dovrei avere il valore cercato.
Leggo la parte del file che mi interessa tramite
        Get #BufferLibero, , HdrSac
HdrSac è una struttura nella quale esiste anche un altro valore tipo NZY as
Long
Dopo che ho letto questa struttura, passo a cambiare i byte di questo valore
        HdrSac.NZY = Cambia_Long(HdrSac.NZY)
La routine è questa
(Chiaramente per i valori LONG)
Public Function Cambia_Long(Dest As Long)
    Dim ByteSort(0 To 3) As Byte, ByteSwap As Byte
    CopyMemory ByteSort(0), Dest, 4
    ByteSwap = ByteSort(0)
    ByteSort(0) = ByteSort(3)
    ByteSort(3) = ByteSwap
    ByteSwap = ByteSort(1)
    ByteSort(1) = ByteSort(2)
    ByteSort(2) = ByteSwap
    CopyMemory Dest, ByteSort(0), 4
End Function
Dest viene valorizzato in ingresso al valore della variabile, swappati i
byte e ricopiati su Dest.
Alla fine della funzione, in effetti Dest contiene il valore esatto, ma
quando vado a leggere la variabile questa è valorizzata a zero.
Perchè? Chi sa darmi una spiegazione?
Grazie a tutti
Sergio

 End Function
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 End Function
Ma non bastava un
Dest = ByteSort(3) * &H1000000 + _
       ByteSort(2) * &H10000 + _
       ByteSort(1) * &H100 + _
       ByteSort(0)
?
E anzichč la copymemory un
ByteSort(0) = (Dest \ &H1000000) and &HFF
ByteSort(1) = (Dest \ &H10000) and &HFF
ByteSort(2) = (Dest \ &H100) and &HFF
ByteSort(3) = Dest and &HFF
?
Volendo si potevano unire le due cose e fare tutto in un'operazione sola.
Ciao
--
mathParser = "
http://www.neodatatype.net
"
sitoComune = "
http://www.it-lang-vb.net
"

 ByteSort(0) = (Dest \ &H1000000) and &HFF
funzionerebbero solo con gli unsigned long
R

Scusa ma per quale ragione non usi
Public TFourBytes
   MyByte4 As Byte
   MyByte3 As Byte
   MyByte2 As Byte
   MyByte1 As Byte
End Type
E poi lo assegni ad un array passandogli i valori giusti?
Ciao
Andrea

 Perchè? Chi sa darmi una spiegazione?
Perché tu sei un programmatore C ;)
Quando scrivi
HdrSac.NZY = Cambia_Long(HdrSac.NZY)
succedono due cose, nell'ordine
1) HdrSac.NZY cambia il proprio valore perché la passi per riferimento nella
chiamata della function
2) HdrSac.NZY diventa 0 perché la function non restituisce alcun valore,
dato che manca l'asssegnamento esplicito Cambia_Long=xxxx come ha fatto
notare emmexx
In VB o fai una Sub e gli passi il valore da modificare come riferimento,
oppure sfrutti il nome della funzione come variabile che contiene il valore
di ritorno, ma devi assegnarlo esplicitamente.
Mischiare le due cose ha effetti deleteri.
Quindi hai due soluzioni:
i)
Call Cambia_Long(HdrSac.NZY)   (e ti conviene dichiarare Cambia_Long come
Sub, stile void function del C)
ii)
Continui ad usare HdrSac.NZY = Cambia_Long(HdrSac.NZY) ma cambi due cose
della function:
Public Function Cambia_Long(ByRef Dest As Long) as Long e poi aggiungi
l'assegnamento Cambia_Long=Dest
Un consiglio: metticelo sempre il ByRef o ByVal nelle dichiarazioni dei
parametri: molti pensano che normalmente VB passi valori, ma il default e
invece ByRef (più o meno, le stringhe e i variant sono un tantinello più
incasinati). A volte questa semplice assunzione errata è fonte di fastidiosi
problemi.
--
Ciao, Silv:o)

 ha scritto nel messaggio
news:b17u5j$1041fe$1...@ID-97197.news.dfncis.de...

Grazie emmex
mancava proprio il valore da restituire, cioč dopo
CopyMemory Dest, ByteSort(0), 4
Cambia_Long = Dest