Python3 la conversione Unicode da String a int rappresentazione

Come tutti sappiamo, un computer che funziona con i numeri. Sto scrivendo questo testo a destra ora, il server fa un numero e quando la si vuole leggere, si otterrà testo dal server.

Come posso fare questo?

Voglio criptare qualcosa con il mio algoritmo e il mio algoritmo funziona bene con i numeri interi, ma ora voglio criptare una Stringa e non so come convertire una stringa Unicode di un numero intero e viceversa.

Sto usando Python 3. C’è qualcuno che conosce una soluzione elegante per il mio problema?

“voglio criptare qualcosa con il mio algoritmo” – perché?
Benvenuti a Stack Overflow! Vi invitiamo a ricerca le vostre domande. Se hai provato qualcosa di già, si prega di aggiungere alla domanda – se non, di ricerca e di tentare la tua domanda di prima, e poi tornare.
perché voglio imparare la lingua, sto solo giocando un po ‘ e cerco di trovare una soluzione per tutti i upcomming domande. Su questa domanda non ho trovato nessuna soluzione. Non posso pubblicare il mio algorthm perché so che non è sicuro, ma come ho detto, sto solo giocando un po’. @tichodrama: ho trovato domande su questo problema
La vostra comprensione di come funzionano i computer sembra superficiale e impreciso. I computer non “funziona con i numeri”. Computer funziona con matrici binarie; come interpretare e trattare con esso è sul programma. Infatti molti processore istruzioni trattare la matrice binaria di 32 bit che noi chiamiamo “parole” (o “doppio parole”), come alcune rappresentazione binaria di un numero intero, di solito 2-di integrare, o qualche numero frazionario rappresentanza, come lo standard IEEE 754. Ma l’ultima rappresentazione di ciò che la matrice di mezzo ‘ al programmatore e la lingua astrazioni.
Io non sono d’accordo. Il computer in modo chiaro gestisce il binario matrici, non importa di quali dimensioni, come i numeri. Ha built-in funzioni diverse funzioni matematiche delle matrici, interpretato in vari formati, come ad esempio carri etc. Ma è sempre lo tratta come numeri. L’interpretazione, come le altre cose, immagini, testi, ecc, in realtà non accadrà fino a quando i numeri in qualche modo sono visualizzate in alcune dispositivo di output, ad esempio un monitor o una stampante. Il ‘ noi ‘ facendo, l’interpretazione, non il computer.

OriginaleL’autore Emerald | 2012-09-27

5 Replies
  1. 10

    Siete alla ricerca per il ord() funzione, penso:

    >>> ord('a')
    97
    >>> ord('\u00c2')
    192

    Questo ti dà il numero intero per il punto di codice Unicode.

    Per convertire un intero set di caratteri utilizzare un elenco di comprensione:

    >>> [ord(c) for c in 'Hello World!']
    [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]

    È inversa è la chr() funzione:

    >>> chr(97)
    'a'
    >>> chr(193)
    'Á'

    Di notare che quando si esegue la crittografia fine di decifrare il testo, è di solito di codificare il testo di una rappresentazione binaria con un codifica caratteri. Testo Unicode possono essere codificati con codifiche diverse, con diversi vantaggi e svantaggi. In questi giorni il più comunemente usato di codifica del testo Unicode UTF-8, ma ne esistono altri.

    In Python 3, dati binari è rappresentato nel byte oggetto, e la codifica di testo per byte con il str.encode() metodo e tornare indietro utilizzando byte.decode():

    >>> 'Hello World!'.encode('utf8')
    b'Hello World!'
    >>> b'Hello World!'.decode('utf8')
    'Hello World!'

    bytes valori sono in realtà solo sequenze, come le liste e le tuple e stringhe, ma composto di numeri interi da 0 a 255:

    >>> list('Hello World!'.encode('utf8'))
    [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]

    Personalmente, quando la crittografia, che si desidera codificare e crittografare la risultante di byte.

    Se tutto questo sembra travolgente e difficile da seguire, forse questi articoli su Unicode e codifiche dei caratteri può essere di aiuto:

    posso fare questo con tutta la stringa? (Una Stringa -> Uno Intero)
    Che cosa sarebbe un intero significare? È possibile trasformare ogni carattere in un numero intero; ho aggiornato la mia risposta per mostrare come l’hai fatto per tutta la stringa. La conversione di tale stringa uno non ha molto senso.
    Ho pensato che fosse più veloce per inviare un numero intero per il mio algoritmo di centinaia, ma penso che la tua soluzione è la migliore. Grazie mille!
    Sarebbe un numero molto grande. Più che il processore sarebbe di gestire in modo nativo. Come tale, esso sarà diviso in tanti numeri comunque, a beneficio di nulla.

    OriginaleL’autore Martijn Pieters

  2. 10

    Il solito modo per convertire la stringa Unicode un numero è quello di convertire la sequenza di byte. I caratteri Unicode sono pura astrazione, ogni personaggio ha il suo numero; tuttavia, ci sono più modi per convertire i numeri per il flusso di byte. Probabilmente il più versatile di un modo di fare che è quello di codificare la stringa di codifica UTF-8. Si possono scegliere molti modi per ottenere un numero intero. Qui è uno (ho preso in prestito la bella stringa da Ivella — spero di no parolacce sono all’interno 🙂 :

    Python 3.2.1 (default, Jul 10 2011, 20:02:51) [MSC v.1500 64 bit (AMD64)] on win32
    Type "copyright", "credits" or "license()" for more information.
    >>> s = "Hello, World, عالَم, ދުނިޔެ, जगत, 世界"
    >>> b = s.encode('utf-8')
    >>> b
    b'Hello, World, \xd8\xb9\xd8\xa7\xd9\x84\xd9\x8e\xd9\x85, \xde\x8b\xde\xaa\xde\x82\xde\xa8\xde\x94\xde\xac, \xe0\xa4\x9c\xe0\xa4\x97\xe0\xa4\xa4, \xe4\xb8\x96\xe7\x95\x8c'

    Ora abbiamo sequenza di byte in cui quelli con il numero da 128 a 255 vengono visualizzati come hex codifica di sequenze di escape. Proviamo a convertire tutti i byte loro hexcodes come bytestring.

    >>> import binascii
    >>> h = binascii.hexlify(b)
    >>> h
    b'48656c6c6f2c20576f726c642c20d8b9d8a7d984d98ed9852c20de8bdeaade82dea8de94deac2c20e0a49ce0a497e0a4a42c20e4b896e7958c'

    E siamo in grado di guardare ad esso come ad un grande numero di scritti (come testo) in notazione esadecimale. Il int ci permette di convertire astratta numero che, quando stampato-è più di solito convertita in notazione decimale.

    >>> i = int(h, 16)
    >>> i
    52620351230730152682202055464811384749235956796562762198329268116226267262806875102376740945811764490696968801603738907493997296927348108

    Ora è possibile memorizzare un numero di cifrare (anche se è più usuale per crittografare la precedente sequenza di byte), e poi convertire il numero intero. Attenzione, non c’è in molte lingue (e, probabilmente, nessun database) che sono in grado di lavorare con grandi numeri interi.

    Torniamo alla stringa originale. In primo luogo la conversione è la rappresentazione esadecimale (stringa).

    >>> h2 = hex(i)
    >>> h2
    '0x48656c6c6f2c20576f726c642c20d8b9d8a7d984d98ed9852c20de8bdeaade82dea8de94deac2c20e0a49ce0a497e0a4a42c20e4b896e7958c'
    >>> h3 = h2[2:]   # remove the 0x from the beginning
    >>> h3
    '48656c6c6f2c20576f726c642c20d8b9d8a7d984d98ed9852c20de8bdeaade82dea8de94deac2c20e0a49ce0a497e0a4a42c20e4b896e7958c'
    >>> type(h3)
    <class 'str'>

    Abbiamo dovuto rimuovere il 0x come si dice solo che il resto sono i caratteri esadecimali che rappresentano il numero. Si noti che il h3 è di str tipo. Come siamo in Python 3 (vedere in alto), il str significa stringa Unicode. Il passo successivo è quello di convertire le coppie di hexa numeri indietro a livello di byte. Proviamo unhexlify():

    >>> binascii.unhexlify(h3)
    Traceback (most recent call last):
      File "<pyshell#16>", line 1, in <module>
        binascii.unhexlify(h3)
    TypeError: 'str' does not support the buffer interface

    Oops! si accettano solo bytestrings. Quindi, la codifica di ogni hexa numero Unicode per hexa valore nel bytestring. Il modo per andare è quello di codificare; tuttavia, la codifica ASCII è banale.

    >>> b2 = h3.encode('ascii')  # character by character; subset of ascii only
    >>> b2
    b'48656c6c6f2c20576f726c642c20d8b9d8a7d984d98ed9852c20de8bdeaade82dea8de94deac2c20e0a49ce0a497e0a4a42c20e4b896e7958c'
    >>> b3 = binascii.unhexlify(b2)
    >>> b3
    b'Hello, World, \xd8\xb9\xd8\xa7\xd9\x84\xd9\x8e\xd9\x85, \xde\x8b\xde\xaa\xde\x82\xde\xa8\xde\x94\xde\xac, \xe0\xa4\x9c\xe0\xa4\x97\xe0\xa4\xa4, \xe4\xb8\x96\xe7\x95\x8c'

    Ora abbiamo simili bytestring dopo la prima .encode('utf-8'). Facciamo l’operazione inversa — decode da UTF-8. Si dovrebbe ottenere la stessa stringa Unicode che abbiamo iniziato con.

    >>> s2 = b3.decode('utf-8')
    >>> s2
    'Hello, World, عالَم, ދުނިޔެ, जगत, 世界'
    >>> s == s2   # is the original equal to the result?
    True

    🙂

    OriginaleL’autore pepr

  3. 5

    Da python documentazione:

    Il binascii modulo contiene un certo numero di metodi per la conversione tra
    binario e vari codificato in ASCII rappresentazioni binarie.

    Per esempio, si potrebbe utilizzare binascii.hexlify per ottenere una rappresentazione esadecimale del stringa binaria “LOL”, e di trasformarlo in un numero intero attraverso il int funzione built-in:

    >>> binascii.hexlify(b"LOL")
    b'4c4f4c'
    >>> int(binascii.hexlify(b"LOL"), 16)
    5001036

    Dal momento che è necessario per applicare questo per le stringhe unicode, è necessario prima di codificarli come stringhe binarie. È possibile utilizzare il metodo str.codifica per questo scopo:

    >>> int(binascii.hexlify("fiŝaĵo".encode("utf-8")), 16)
    7379646744164087151

    .

    Per il viceversa, è necessario invertire ogni passo. In primo luogo, ruotare il numero intero in una rappresentazione esadecimale come stringa binaria (si può andare con formato(int, "x") e poi codificare), spegnere l’hex ascii con binascii.unhexlify e, infine, decodificare come utf-8:

    >>> binascii.unhexlify(format(7379646744164087151, "x").encode("utf-8")).decode("utf-8")
    'fiŝaĵo'

    Questo era un passo-passo la spiegazione, se davvero sarà l’utilizzo di questo handicap potrebbe essere una buona idea per organizzare in forma di funzioni.

    OriginaleL’autore etuardu

  4. 0

    Edificio sulla soluzione data da Martijn Pieters, è possibile rendere la vostra stringa di un numero enorme, che Python 3 può trattare molto bene, poiché il tipo int è arbitrariamente grande (che non è “come il computer funziona”, vedi il mio commento alla tua domanda).

    Dato la lista del carattere codici numerici:

    >>> a = [ord(c) for c in 'Hello World!']
    >>> print(a)
    [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]

    E conoscere, da Wikipedia pagina Unicode che il massimo di caratteri unicode numero è 10FFFF (in esadecimale), si può fare:

    def numfy(s):
        number = 0
        for e in [ord(c) for c in s]:
            number = (number * 0x110000) + e
        return number
    
    def denumfy(number):
        l = []
        while(number != 0):
            l.append(chr(number % 0x110000))
            number = number // 0x110000
        return ''.join(reversed(l))

    Così:

    >>> a = numfy("Hello, World, عالَم, ދުނިޔެ, जगत, 世界")
    >>> a
    31611336900126021[...]08666956
    >>> denumfy(a)
    'Hello, World, عالَم, ދުނިޔެ, जगत, 世界'

    Dove questo 0x110000 (da 10FFFF + 1) è il numero di diversi previste caratteri Unicode (1114112, in decimale). Se si è sicuri che si sta utilizzando solo alfabeto inglese, è possibile utilizzare qui 128, e se si sta utilizzando una lingua latina con gli accenti, è sicuro da usare 256. In ogni modo il numero sarà molto più piccolo, ma di non essere in grado di rappresentare ogni carattere Unicode.

    OriginaleL’autore lvella

  5. -1

    Questo converte ogni personaggio a un numero…

    s="hello \u2020"
    print [ord(c) for c in s]
    posso fare questo con tutta la stringa? (Una Stringa -> Uno Intero)
    Come Martijn ha detto nella sua risposta, la conversione di una stringa come un tutto non ha molto senso; e routine di cifratura dovrebbe prendere un flusso di numeri di fine – vedi hashlib.aggiornamento per esempio.

    OriginaleL’autore spiralx

Lascia un commento