From GUID to OID

di Timer86 il
11 risposte
Ciao a tutti,

non m isono mai trovato davanti a questa situazione, dovrei convertire un documento salvato come GUID in un archiviatore elettronico in OID.
però onestamente e appasionatamente non so da dover inziiare e dove mettere le mani. sono riuscito a trovare un Powershell che indicano come funzionante ma onestamente non ho la più pallida idea di come poterlo convertire in vb.net

$link= "http://exmans.ester.it/&OID="+ (ConvertTo-Oid -guid $eDocTable[$eDocIndex].G_U_I_D)
Function ConvertTo-Oid
{
Param([Parameter(Position=0, Mandatory=$true)]  [String] $guid)
      $guidClass = (($guid -shr 60) -band 15)
      $guidID    = (($guid -band 0x0FFFFFFFFFFFFFFFL) -shr (60 - ($guidClass * 4)))
      $guidValue = $guid -band (0x0FFFFFFFFFFFFFFFL -shr ($guidClass * 4))
     #Assemble result
     if (($guidClass -eq 0) -and ($guidID -eq 0)) {
        # Handle special case
        return "0-" + '{0:X}' -f $guidValue
     }
     else{
        return ("" + ('{0:X}' -f $guidClass) + "" + ('{0:X}' -f $guidID) + "-" + ('{0:X}' -f $guidValue))
     }
}

11 Risposte

  • La tua domanda, messa cosi', non ha senso!

    Un OID e' un "Object Identifier" e IN TEORIA puo' essere QUALUNQUE COSA. Ovviamente, se lo usi da qualche parte che lo richiede in uno specifico formato E' TUTTA UN'aLTRA STORI.

    Un GUID (Globally Unique Identifier) e' un id UNIVOCO A LIVELLO dell'INTERO UNIVERSO (proprio l'universo dell'astronomia), QUINDI puo' essere usato ANCHE come OID.

    Quindi, PERCHE' vuoi convertire il GUID in OID?

    Da nessuna parte c'e' scritto che non puoi generare degli OID per i fatti tuoi, purche' siano univoci per l'uso che ne devi fare.
  • Onestamente, perchè come dal codice sopra, il valore stesso che viene preso in esame.
    viene convertito d aGUID a OID, questa conversione mi permette di creare dunque un link, e in quel link posso prelevare in automatico il documento chhe che è salvato all'interno.

    però senza poter effettuare la conversione come viene effettuata, da quel powershell non posso fare niente.

    in pratica credo che trasformi(e lo hanno anche fatto in passato) la guid in valore esadecimale per poi ritrasformarloin quello che è OID.
  • Non ho capito niente!

    CHE COSA E', per te, l'OID? Come e' fatto? E' un intero? Una stringa? Una struttura dati?

    Mostra un esempio di questo famigerato OID
  • Ciao,

    mi spiego meglio, addentrandomi oggi per la prima volta nell'argomento, sto apprendendo notizioni, mano a mano che le ore e i minuti passano.
    In pratica parto dall'inizio.

    devo costruire un link,
    come mostrato qua $link= "http://exmans.$branch.it/&OID="+ (ConvertTo-Oid -guid $eDocTable[$eDocIndex].G_U_I_D)
    al posto di quel convert, ti mostro cosa in teoria cosa viene fuori.

    questo è il link che si dovrebbe generare, come vedi OID=741-15dba2a
    http://exmans.$branch.it:7000/edoc/main?object=document&method=stream&watermark=true&OID=741-15dba2a

    per creare questo link devo estrapolare dal nostro database il campo document guid = esempio

    "8070450811443543539" (questa è una che a db definiamo guid)

    dunque come avevo postato, ho uno script in powershell funzionante(così mi riportano che fa questo tipo di funzione), ma onestamente io vorrei averlo incluso nella mia applicazione, senza doverlo lanciare ogni volta, ma convertirlo da pwshell a vb.net

    riposto il codice nuvoamente per doppia chiarezza.
    ti ringrazio e scusami se non mi sono spiegato a dovere.
    
    $link= "http://exmans.$branch.it:7000/edoc/main?object=document&method=stream&watermark=true&OID="+ (ConvertTo-Oid -guid $eDocTable[$eDocIndex].G_U_I_D)
    Param([Parameter(Position=0, Mandatory=$true)]  [String] $guid)
        
          $guidClass = (($guid -shr 60) -band 15)
          $guidID    = (($guid -band 0x0FFFFFFFFFFFFFFFL) -shr (60 - ($guidClass * 4)))
          $guidValue = $guid -band (0x0FFFFFFFFFFFFFFFL -shr ($guidClass * 4))
         #Assemble result
         if (($guidClass -eq 0) -and ($guidID -eq 0)) {
            # Handle special case
            return "0-" + '{0:X}' -f $guidValue
         }
         else{
            return ("" + ('{0:X}' -f $guidClass) + "" + ('{0:X}' -f $guidID) + "-" + ('{0:X}' -f $guidValue))
         }
    }
    
  • In pratica con un aiuto di un collega siamo riusciti a tradurlo quasi tutto, quello che però ci restituisce errore è la GuidValue =
    li ci rende il valore 0 anzichè 23518384, idee?
    
            datas = "8070452052689870000"
            'xlworksheet.Range("H" & i).Text
            MsgBox(datas)
            Guidclass = (shr(datas, 60) And 15)
            'GUILD CLASS SHOULD BE 7'
            MsgBox(Guidclass)
            guidID = shr((datas And &HFFFFFFFFFFFFFFFL), 60 - (Guidclass * 4))
            'GUID ID SHOULD BE 354'
            MsgBox(guidID)
    
            guidValue = datas And shr(&HFFFFFFFFFFFFFFFL, (Guidclass * 4))
            MsgBox(guidValue)
            'GUIDVALUE 23518384'
            
            
  • Buongiorno,
    altro test di stamani, cn cui sto provando.
    questa è la variante senza test. Mi spiego meglio, ho provato a isolare Guidvalue per vedere se l'operazione guidvalue del powershell mi veniva fuori lo stesso coefficiente.

    la risultante del test prevedeva il calcolo di powershell della riga modificata in questa maniera
    $guidValue = (0x0FFFFFFFFFFFFFFFL -shr ($guidClass * 4))
    la risultante da 4294967295

    su vb.net invece ho provato come sopra
    guidValue = shr(&HFFFFFFFFFFFFFFFL, (Guidclass * 4))
    la risultante che torna invece è 4294967296

    questa è la prima differenza, se invece lo posto integrale ossia come dovrebbe essere
    $guidValue =$guid -band (0x0FFFFFFFFFFFFFFFL -shr ($guidClass * 4))
    la risultante diventa GUIDVALUE 23518384

    mentre in vb.net è 0 sotto espressione.
    GuidValue = datas And shr(&HFFFFFFFFFFFFFFFL, (Guidclass * 4))
    ora quello che non so è, ho tradotto male la formula di sopra?

    Oppure la funzione SHR è sbagliata?
        Public Function shr(ByVal Value As Int64, ByVal Shift As Byte) As Int64
            Dim i As Byte
            shr = Value
            If Shift > 0 Then
                shr = Int(shr / (2 ^ Shift))
            End If
        End Function
    Oppure ancora ho sbagliato a dichiarare le variabili?
      Dim Guidclass As Int64
            Dim guidID As Int64
            Dim guidValue As Int64
    Dim datas As Int64
    ho provato a dichiararle anche come long ma senza risultato.
  • $guidValue = (0x0FFFFFFFFFFFFFFFL -shr ($guidClass * 4))
    spiegami cosa dovrebbe fare questa linea perchè io non l'ho capito, dimmi anche cosa vale $guidClass e cosa dovrebbe poi valere $guidValue
  • Lo shift a destra (shr) scrivila così
    
        Public Function shr(ByVal Value As Int64, ByVal Shift As Byte) As Int64
            shr = Value >> Shift
        End Function
    
    In realtà sarebbe meglio lavorare con interi senza segno ovvero UInt64
  • Ciao a Tutti,

    giusto per non lasciare un post senza risposta e conclusione del caso,
    ho trovato la mia risposta da solo.

    vi posto il codice.
    
    tutte le variabili vanno dichiarate come uint64
    exguid = Convert.ToUInt64(datas)
                            Guidclass = ((exguid >> 60) And 15)
                            guidID = (exguid And &HFFFFFFFFFFFFFF) >> (60 - 4 * Guidclass)
                            m = &HFFFFFFFFFFFFFF >> (4 * Guidclass)
                            guidValue = exguid And m
                            '  MsgBox("Datas :" & datas & "- GuidClass :" & Guidclass & " - GuidID :" & guidID & "- guidValue :" & guidValue)
                            If (Guidclass = 0) And (guidID = 0) Then
                                hedvalue = "0-" + CStr(Hex(guidValue))
                            Else
                                Dim clastr As String = CStr(Hex(Guidclass))
                                Dim guistr As String = CStr(Hex(guidID))
                                Dim guidstr As String = CStr(Hex(guidValue))
                                hedvalue = "" & clastr & "" & guistr & "-" & guidstr
    
  • Ma le leggi le risposte?
  • Ciao oregon,
    scuusami ma l'avevo letta in ritardo.
Devi accedere o registrarti per scrivere nel forum
11 risposte