From GUID to OID

di il
11 risposte

From GUID to OID

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

  • Re: From GUID to OID

    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.
  • Re: From GUID to OID

    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.
  • Re: From GUID to 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
  • Re: From GUID to 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))
         }
    }
    
  • Re: From GUID to OID

    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'
            
            
  • Re: From GUID to OID

    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.
  • Re: From GUID to OID

    $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
  • Re: From GUID to OID

    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
  • Re: From GUID to OID

    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
    
  • Re: From GUID to OID

    Ma le leggi le risposte?
  • Re: From GUID to OID

    Ciao oregon,
    scuusami ma l'avevo letta in ritardo.
Devi accedere o registrarti per scrivere nel forum
11 risposte