Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [vb6] Scrive al contrario nei bin !

    Ho realizzato il seguente codice per scrivere all'interno di un file binario:

    Sub stampa(nome As String, valore As String)
    Dim bt As Long
    FF = FreeFile
    Open nome For Binary As #FF
    bt = DC(valore)
    Seek #FF, 3
    Put #FF, , bt
    Close #FF
    End Sub

    Se scrivo un solo byte per esempio "FE" me lo scrive correttamente in posizione 3, ma se scrivo "FE D1" al posto di scrivere "FE" in posizione 3 e "D1" in posizione 4, scrive "FE" in posizione 3 e "D1" in posizione 2 ossia lo scrive al contrario, questo anche se opero su 3 byte:li scrive al contrario...

    PS DC() è solo una funzione di conversine esadecimale->decimale che funziona alla perfezione (ho confrontato co la conversione fatta con la calcolatrice)

    Idee di dove posso aver sbagliato?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non e' vero che se scrivi un solo byte lo scrive in posizione 3. Lo scrive in posizione 2, che sarebbe il terzo byte perche' la posizione e' espressa con la Seek a partire da 1 e corrisponde al primo byte (byte 0) del file.

    Cioe', nel caso del valore FE (che poi per un long e' 000000FE) questo viene scritto

    00 01 02 03 04 05 <- posizione
    00 00 FE 00 00 00 <- byte

    Nel caso di FED1 (ovvero del long 0000FED1)

    00 01 02 03 04 05 <- posizione
    00 00 D1 FE 00 00 <- byte

    Se fosse 12345678, allora

    00 01 02 03 04 05 <- posizione
    00 00 78 56 34 12 <- byte

    Ed e' tutto corretto. Ricorda che le CPU Intel gestiscono i byte nelle parole in "little endian order", dalla parte bassa a quella alta ...

    P.S. La Seek puo' essere eliminata e puoi scrivere Put #FF, 3, bt

  3. #3
    quello che mi sarebbe servito è che i byte venissero scritti
    Nel caso di FED1 in posizione 02 nel modo seguente:

    00 01 02 03 04 05 <- posizione
    00 00 FE D1 00 00 <- byte

    mi sa che per avere questo quindi devo andare a scrivere byte per byte ... cioè divido FED1 in FE e D1 poi scrivo FE all'offset 3 e D1 all'offset 4 giusto?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Devi cambiare il comportamento della tua funzione DC in modo che inserisca i dati nell'ordine usato dalla CPU, se devi restituire un long.

    Altrimenti, non usare il long ma un array di byte ...

    Mostrami il codice della DC e dimmi come arrivano i dati nella stringa valore ...

  5. #5
    Function DC(esa) As Long
    Dim n, i, temp As Integer
    Dim cifra as String
    decimale = 0
    n = Len(esa)
    For i = 1 To n
    cifra = UCase(Mid(esa, i, 1)) ' estraggo il carattere a peso maggiore
    If (InStr("0123456789ABCDEF", cifra) - 1) = -1 Then DC = -5: GoTo ESCI
    'se non è un carattere esadecimale la funzione ritorna -5
    temp = temp + (InStr("0123456789ABCDEF", cifra) - 1) * 16 ^ (n - i)
    Next
    DC = temp
    ESCI: End Function

    Mi ritorna in pratica lo stesso indentico valora che avrei convertendo da HEX->DEC con la calcolatrice di windows...

    La stringa contenuta in valore arriva da una textbox

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Mi sembra che ci sia piu' di qualcosa che non va ...

    Ad esempio, utilizzi un ciclo per trattare i singoli caratteri della stringa, che puo' essere arbitrariamente lunga ... ma il risultato lo aggiungi ad una variabile Integer, che e' limitata al valore di 32767 ...

    Poi restituisci la Integer mentre la funzione restituisce una Long ...

    Insomma, ci sono parecchie incongruenze ...

    Quello che ti voglio dire e' che la funzione potrebbe essere riscritta e migliorata parecchio, ma per darti una mano dovresti darmi le specifiche precise della funzione ...

    Ovvero

    1) deve ricevere una stringa di lunghezza qualsiasi?

    2) in quale formato? Puo' essere una qualsiasi stringa esadecimale?

    3) il valore massimo restituito deve essere un long? Un integer? Devono essere considerati tutti i byte?

  7. #7
    seconda versione

    Function DC(esa) As Long
    Dim n, i As Integer
    Dim cifra as String
    Dim temp as long
    decimale = 0
    n = Len(esa)
    For i = 1 To n
    cifra = UCase(Mid(esa, i, 1)) ' estraggo il carattere a peso maggiore
    If (InStr("0123456789ABCDEF", cifra) - 1) = -1 Then DC = -5: GoTo ESCI
    'se non è un carattere esadecimale la funzione ritorna -5
    temp = temp + (InStr("0123456789ABCDEF", cifra) - 1) * 16 ^ (n - i)
    Next
    DC = temp
    ESCI: End Function

    1) in teoria si, poi in pratica non possiamo prendere una stringa qualsiasi nel vero senso della parola perchè siamo limitati dalla dimensione della Long...

    2)può essere una stringa esadecimale qualunque (nei limiti del punto uno)

    3)il valore che restituisce l'ho fatto long per questioni di dimensioni.... in realtà il valore che restituisce questa funzione poi nel codice chiamante va ad essere il terzo argomento della PUT ossia i byte che andiamo a scrivere : PUT #a, ,DC(ESA)

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quindi, mi dici che se tu ricevi la stringa

    ABCDEF01020304050607

    ti interessano solamente i valori

    ABCDEF01

    Se e' cosi', allora la for andra' ad esaminare il resto della stringa ed avrai un errore (overflow).

    Se sei sicuro che dovrai ottenere un long (al massimo) ti conviene eliminare la for ed effettuare una conversione diretta. Se e' cosi', e ti interessa, ti potrei scrivere un esempio ...

    P.S. la variabile decimale non serve ... non la utilizzi ...

  9. #9
    in realtà i valori che tratto come lunghezza massima hanno 64 byte non avendo trovato nessun tipo di variabile così grande ho diviso la stringa di partenza ABCDEF01020304050607.... in
    ABCDEF01 - 02030405 - 0607... in modo che ogni gruppo fosse di 4 byte ... quindi alla funzione DC arrivano solo stringhe di 8 caratteri

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma tu non devi trattare per forza dei dati di tipo numerico.

    Puoi utilizzare degli array di byte e cosi' aggiri anche il problema dell'ordine dei byte.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.