Byte to second - secondi trascorsi dal 2 gennaio 2000

di il
15 risposte

Byte to second - secondi trascorsi dal 2 gennaio 2000

Salve,
ho un file binario che apro così:
Dim bytes() As Byte = File.ReadAllBytes("J:\00000001\BAK.QQ")
Avendo un tracciato di questo tipo:
Numero di record (i): 3B
Record data: 14B * i
Utente: 5B
Data e ora: 4B //How many seconds is it from 2nd January,2000.
Altre informazioni: 5B

Se ad esempio leggo i 4 bytes che identificano la data
bytes(8) bytes(9) bytes(10) bytes(11)

ottengo questi 4 valori 35 104 180 81

Che dovrebbe corrispondere ai secondi trascorsi dal 2 gennaio del 2000
La data dovrebbe essere 20/10/2018 10:51

Ma non riesco a capire come convertire i 4 byte nel numero dei secondi corretti che dovrebbero essere circa 594.064.440

Qualcuno riesce ad aiurtami ?

Grazie

15 Risposte

  • Re: Byte to second - secondi trascorsi dal 2 gennaio 2000

    Strano che i byte non siano invertiti comunque

    35×16777216+104×65536+180×256+81
  • Re: Byte to second - secondi trascorsi dal 2 gennaio 2000

    Grazie mille, funziona alla grande !!
  • Re: Byte to second - secondi trascorsi dal 2 gennaio 2000

    oregon ha scritto:


    Strano che i byte non siano invertiti comunque

    35×16777216+104×65536+180×256+81
    che sarebbe 35 × 12^24 + 104 × 2^16 + 180 × 2^8 + 81
  • Re: Byte to second - secondi trascorsi dal 2 gennaio 2000

    Adesso approfitto ancora della vostra conoscenza perchè mi sono arenato di nuovo:

    Il passo successivo è questo che leggo sul tracciato:

    The length of the password+password: 3B
    // The first bytes's higher 4 bits are the length of the password. If the staffer does not have a password,it is "ffffff".

    Card number: 3B
    //If the staffer does not have the card number, it is "ffffff".

    Name: 10B questo però è un valore che deve diventare alfanumerico

    64 0 4 210 0 40 52 42 0 83 0 101 0 110 0 97

    Come dovrei procedere ?

    Non capisco questo: The first bytes's higher 4 bits are the length of the password.

    Grazie
  • Re: Byte to second - secondi trascorsi dal 2 gennaio 2000

    I primi 3 byte (lunghezza password) in esadecimale sono 40 00 04
    Devi tenere presente solo la prima cifra esadecimale (higher 4 bits) del primo byte (first byte) ovvero il 4 di 40. Quindi la password sarà di 4 caratteri.
    Penso che la password sia in Unicode (2 byte per carattere) e i caratteri significativi potrebbero essere 83 101 110 97 tradotti in ASCII

    Sena
  • Re: Byte to second - secondi trascorsi dal 2 gennaio 2000

    Ti posso dire con certezza che la password è 1234 e card number è 2634794

    come faccio a risalire ?
  • Re: Byte to second - secondi trascorsi dal 2 gennaio 2000

    40 52 42 corrisponde a quel valore ( fai tu i calcoli come prima considerando che manca la parte più grande ).

    Prima si continuare, di cosa stiamo parlando? Che dati sono?
  • Re: Byte to second - secondi trascorsi dal 2 gennaio 2000

    Ok grazie, in pratica devo effettuare importazioni ed esportazioni verso un marcatempo presenze per i dipendenti, per problemi logistici l'unica maniera per effettuare scambio dati è tramite una pendrive per cui devo leggere e scrivere file binari secondo un tracciato definito

    Dovendo fare anche l'inverso in fase dio esportazione, come faccio poi a trasformare l'inverso ?
    Ovvero portare 1234 in 40 52 42 ?

    Grazie ancora
  • Re: Byte to second - secondi trascorsi dal 2 gennaio 2000

    No ... il valore 2634794 è 40 52 42 non la password.

    Sulla password non entro nel merito perché non mi piace entrare in questi contesti non potendo controllare di persona.

    La conversione contraria la fai con delle semplici divisioni, dai ci puoi riuscire anche da solo...
  • Re: Byte to second - secondi trascorsi dal 2 gennaio 2000

    Ioparlavo della password in pratica 64 0 4 210

    LenPWD = Hex$(CLng(Asc(64))) ' valore che non uso ma serve quando devo scrivere il bin
    PWD1 = CLng(Asc(4)) * 256
    PWD2 = CLng(Asc(210))
    PWD = PWD1 + PWD2

    PWD= 1234

    Adesso devo fare anche l'inverso
    Come riportare 1234 a 64 0 4 210 ??

    Tu dici con le divisioni dovrei riuscirci ?
  • Re: Byte to second - secondi trascorsi dal 2 gennaio 2000

    Per il 64 basta dividere per 16 o moltiplicare per 16

    Per il resto è una serie di divisioni e valutazioni del resto ... mi sembra troppo semplice perché tu non possa arrivarci da solo
  • Re: Byte to second - secondi trascorsi dal 2 gennaio 2000

    Praticamente stai discutendo in

    http://www.visual-basic.it/Forum/tabid/151/aft/44718/Default.aspx#.W9i7fJNKiUl

    contemporaneamente sullo stesso problema. Il crossposting non è una bella cosa e qui è (giustamente) vietato.
  • Re: Byte to second - secondi trascorsi dal 2 gennaio 2000

    Perdonatemi non sapevo fosse vietato chiedere consiglio a 2 community, non comprendo il motivo, ma chiedo scusa comunque, neanche conoscevo il termine crossposting ....
  • Re: Byte to second - secondi trascorsi dal 2 gennaio 2000

    Nessuno lo sa se non si legge il regolamento. In genere si fa prima di usare un forum.

    Comunque, per chiudere, le semplici operazioni sono
    
            Dim p As Long = 1234
    
            Dim b0 As Byte = p.ToString().Length * 16
            Dim b1 As Byte = p \ 65536
            Dim m1 As Long = p Mod 65536
            Dim b2 As Byte = m1 \ 256
            Dim b3 As Byte = m1 Mod 256
    
    e i valori saranno in b0 b1 b2 b3
Devi accedere o registrarti per scrivere nel forum
15 risposte