Monday, 6 November 2017

0x95 Binary Options


Hidrd contiene hidrd-convert - una herramienta para convertir descriptores de informes entre formatos. Como es compatible con la lectura y escritura de XML, es adecuado para la creación y edición de descriptor, a la par con y de alguna manera mejor que la herramienta oficial de descriptor de HID. Las ventajas de la herramienta oficial son: ejecución en nix de forma nativa, lectura de descriptores nativos (binarios), salida de descriptor nativa más pequeña, generación de descriptores de informes no interactivos, permitiendo su uso en compilaciones de software / firmware. Hidrd-convert --help salida: Consulte hidrd-convert --help-formats para las opciones de formato. Dado un descriptor de informe de ratón en binario (hex-dumped con od - An - tx1. Revertir con xxd - r - p): Utilizar hidrd-convert - o spec para mostrarlo en el formato de ejemplo de especificación HID: Convertirlo a XML con hidrd - convertir - o xml (envuelto para la legibilidad): Después de editar (por ejemplo, quitar la entrada de la rueda), convertirlo de nuevo a binario con hidrd-convert - i xml (hex-dumped con od - An - tx1 revertir con xxd - r - P): O bien, utilice el código hidrd-convert - i xml - o para producir código fuente C para el descriptor editado: Hidrd utiliza su propio esquema XML para descriptores de informes, ya que no existe un estándar. Se instala en /usr/share/xml/schema/hidrd. xml y es la referencia definitiva al formato XML. El esquema se genera desde lib / fmt / xml / hidrd. xsd. m4 durante la compilación sustituyendo la página de uso y los tokens de ID. La plantilla puede ser más fácil de navegar, ya que es mucho más corto. Sin embargo, es un esquema grande, por lo que una breve introducción sigue. El elemento raíz de un descriptor es descriptor. Y su contenido son elementos o elemento meta. Cada elemento de elemento corresponde a un elemento de descriptor de informe único (por ejemplo, la entrada.) Y puede tener atributos o elementos secundarios que describen sus parámetros (por ejemplo, atributo de tipo de colección o elementos de indicador de entrada). La mayor parte del tiempo, los parámetros se describen con elementos secundarios. Todos los nombres de elemento de elemento coinciden con los nombres de elementos de especificación HID, sólo en minúsculas y con espacios reemplazados por subrayados. Los elementos del elemento meta tienen nombres en mayúsculas y corresponden a dos elementos del descriptor del informe: uno para la apertura y otro para la etiqueta de cierre. Sólo hay tres de ellos: COLECCIÓN. PUSH y SET. Cada uno puede ser representado por un par de elementos de elementos en su lugar (colección / endcollection, push / pop, delimitador de apertura / delimitador de cierre). El elemento de elemento meta COLLECTION tiene atributo de tipo, similarmente a la colección. Elementos de elementos de meta se proporcionan por conveniencia y pueden contener elementos de artículo y elementos de meta-elemento. Siempre que se acepte un valor de token, como para el atributo de tipo COLLECTION o el contenido del elemento de página de uso, también se acepta un valor numérico (decimal o hexadecimal, pero no ambos). Esto se proporciona para soportar valores desconocidos para hidrd. Consulte el esquema para más detalles. Los artículos arbitrarios cortos y largos también son apoyados, aunque no se ven en la práctica. De hecho, el flujo binario arbitrario debe ser representable con el esquema, pero hidrd no lo soporta en este momento. El desarrollo de Hidrd estuvo estancado durante mucho tiempo, sin embargo se debe hacer algo de rediseño interno, particularmente en el reporte de errores. A continuación, tal vez, la especificación ejemplo de soporte de entrada debe ser implementado. Entonces la validación necesita ser limpiada (bugs 1 y 7). Después de eso, el tiempo puede llegar a implementar un filtro de validación de flujo con recomendaciones de HID Parser Error Checking. Hidrd contiene hidrd-convert - una herramienta para convertir descriptores de informes entre formatos. Como es compatible con la lectura y escritura de XML, es adecuado para la creación y edición de descriptor, a la par con y de alguna manera mejor que la herramienta oficial de descriptor de HID. Las ventajas de la herramienta oficial son: ejecución en nix de forma nativa, lectura de descriptores nativos (binarios), salida de descriptor nativa más pequeña, generación de descriptores de informes no interactivos, permitiendo su uso en compilaciones de software / firmware. Hidrd-convert --help salida: Consulte hidrd-convert --help-formats para las opciones de formato. Dado un descriptor de informe de ratón en binario (hex-dumped con od - An - tx1. Revertir con xxd - r - p): Utilizar hidrd-convert - o spec para mostrarlo en el formato de ejemplo de especificación HID: Convertirlo a XML con hidrd - convertir - o xml (envuelto para la legibilidad): Después de editar (por ejemplo, quitar la entrada de la rueda), convertirlo de nuevo a binario con hidrd-convert - i xml (hex-dumped con od - An - tx1 revertir con xxd - r - P): O bien, utilice el código hidrd-convert - i xml - o para producir código fuente C para el descriptor editado: Hidrd utiliza su propio esquema XML para descriptores de informes, ya que no existe un estándar. Se instala en /usr/share/xml/schema/hidrd. xml y es la referencia definitiva al formato XML. El esquema se genera desde lib / fmt / xml / hidrd. xsd. m4 durante la compilación sustituyendo la página de uso y los tokens de ID. La plantilla puede ser más fácil de navegar, ya que es mucho más corto. Sin embargo, es un esquema grande, por lo que una breve introducción sigue. El elemento raíz de un descriptor es descriptor. Y su contenido son elementos o elemento meta. Cada elemento de elemento corresponde a un elemento de descriptor de informe único (por ejemplo, la entrada.) Y puede tener atributos o elementos secundarios que describen sus parámetros (por ejemplo, atributo de tipo de colección o elementos de indicador de entrada). La mayor parte del tiempo, los parámetros se describen con elementos secundarios. Todos los nombres de elemento de elemento coinciden con los nombres de elementos de especificación HID, sólo en minúsculas y con espacios reemplazados por subrayados. Los elementos del elemento meta tienen nombres en mayúsculas y corresponden a dos elementos del descriptor del informe: uno para la apertura y otro para la etiqueta de cierre. Sólo hay tres de ellos: COLECCIÓN. PUSH y SET. Cada uno puede ser representado por un par de elementos de elementos en su lugar (colección / endcollection, push / pop, delimitador de apertura / delimitador de cierre). El elemento de elemento meta COLLECTION tiene atributo de tipo, similarmente a la colección. Elementos de elementos de meta se proporcionan por conveniencia y pueden contener elementos de artículo y elementos de meta-elemento. Siempre que se acepte un valor de token, como para el atributo de tipo COLLECTION o el contenido del elemento de página de uso, también se acepta un valor numérico (decimal o hexadecimal, pero no ambos). Esto se proporciona para soportar valores desconocidos para hidrd. Consulte el esquema para más detalles. Los artículos arbitrarios cortos y largos también son apoyados, aunque no se ven en la práctica. De hecho, el flujo binario arbitrario debe ser representable con el esquema, pero hidrd no lo soporta en este momento. El desarrollo de Hidrd estuvo estancado durante mucho tiempo, sin embargo se debe hacer algo de rediseño interno, particularmente en el reporte de errores. A continuación, tal vez, la especificación ejemplo de soporte de entrada debe ser implementado. Entonces la validación necesita ser limpiada (bugs 1 y 7). Después de eso, el tiempo puede llegar a implementar un filtro de validación de flujo con las recomendaciones de HID Parser Error Checking. Desplazar los bits de un b pasos a la derecha (cada paso significa quotdivide por dos) Cambio de bits en PHP es aritmética. Bits desplazados fuera de cada extremo se descartan. Los cambios a la izquierda tienen ceros desplazados a la derecha mientras que el bit de signo se desplaza hacia fuera a la izquierda, lo que significa que el signo de un operando no se conserva. Los turnos a la derecha tienen copias del bit de signo desplazado a la izquierda, lo que significa que el signo de un operando se conserva. Utilice paréntesis para asegurar la precedencia deseada. Por ejemplo, un amplificador b true evalúa la equivalencia entonces el bit a bit y while (a amp b) true evalúa el bit a bit y luego la equivalencia. Si ambos operandos para el amplificador. Y los operadores son cadenas, entonces la operación se realizará en los valores ASCII de los caracteres que componen las cadenas y el resultado será una cadena. En todos los demás casos, ambos operandos se convertirán en enteros y el resultado será un entero. Si el operando para el operador es una cadena, la operación se realizará en los valores ASCII de los caracteres que componen la cadena y el resultado será una cadena, de lo contrario el operando y el resultado serán tratados como enteros. Ambos operandos y el resultado para los operadores ltlt y gtgt siempre se tratan como enteros. Ejemplo 1 Operaciones AND, OR y XOR a bit en números enteros ltphp / Ignora la sección superior, es sólo formato para hacer que la salida sea más clara. / Formato (12d 104b) (22d 204b). 3s (42d 404b). N valores array (0. 1. 2. 4. 8) prueba 1 4 echo n Bitwise AND n foreach (valores como valor) valor de resultado prueba de amplificador printf (formato. Foreach (valores como valor) valor de resultado prueba printf (formato, resultado, valor, prueba) echo n Bitwise Exclusivo OR (XOR) n foreach (valores como valor) Ejemplo 2 Operaciones XOR bit a bit en cadenas ltphp echo 12 9 // Salidas 5 echo 12 9 // Exporta el carácter Backspace (ascii 8) // (1 (ascii 49)) (9 (ascii 57)) 8 echo hallo hello // Emite los valores ascii 0 4 0 0 0 // ae 4 echo 2 3 // Salidas 1 // 2 ((int) 3) 1 echo 2 3 // Salidas 1 // ((int) 2 ) 3 1 gt Ejemplo 3 Cambio de bit en enteros ltphp / Aquí están los ejemplos. / Echo n --- BIT SHIFT DERECHO EN LOS INTEGRANTES POSITIVOS --- n val 4 lugares 1 res val gtgt lugares p (res. val. Gtgt. Lugares copia del signo bit desplazado hacia la izquierda) val 4 places 2 res val gtgt Lugares p (res. val. Gtgt. Lugares) val 4 lugares 3 res val gtgt lugares p (res. val. Gtgt. Lugares bits se desplazan hacia la derecha) val 4 lugares 4 res val gtgt lugares p (res. - los lugares, el mismo resultado que el anterior no puede desplazarse más allá de 0) echo n --- BIT SHIFT DERECHA EN LOS INTEGERES NEGATIVOS --- n val - 4 lugares 1 res gtgt lugares p (res. (4 bits) desplazamiento en el lado izquierdo) val - 4 lugares 2 res val gtgt lugares p (res. Val. Gtgt. El mismo resultado que el anterior no puede desplazarse más allá de -1) eco n --- BIT SHIFT IZQUIERDO EN LOS INTEGRANTES POSITIVOS --- n val 4 lugares 1 res val ltlt lugares p (res. val. ltlt. Val 4 lugares (PHPINTSIZE 8) - 4 res val ltlt lugares p (res. Val Ltlt. Lugares) val 4 lugares (PHPINTSIZE 8) - 3 res val ltlt lugares p (res. val. Ltlt lugares. Sign bits se desplazan hacia fuera) val 4 lugares (PHPINTSIZE 8) - 2 res val ltlt lugares p (res. - los lugares cambian a la izquierda - echo n --- BIT SHIFT A LA IZQUIERDA EN LOS INTEGERES NEGATIVOS --- n val - 4 lugares 1 res val ltlt lugares p (res. val. ltlt. Val - 4 lugares (PHPINTSIZE 8) - 3 res val ltlt lugares p (res. Val. Ltlt lugares) val - 4 lugares (PHPINTSIZE 8) - 2 res val ltlt lugares p (res. Hacia fuera lado izquierdo, incluyendo el pedacito de la muestra) / ignora esta sección inferior, él es apenas formato para hacer la salida más clara. / Función p (res. val. Op. Lugares. Nota) formato 0. (PHPINTSIZE 8). Bn printf (Expresión: dds dn. Res. Val. Op. Lugares) echo Decimal: n printf (valdn. val) printf (resdn. Res) echo Binario: n printf (formato val. Res) if (note) echo NOTA: note n Salida del ejemplo anterior en máquinas de 32 bits: BITWISE FLAGS para objetos PHP personalizados A veces necesito un objeto PHP personalizado que contiene varios valores booleanos TRUE o FALSE. Podría fácilmente incluir una variable para cada uno de ellos, pero como siempre, el código tiene una manera de obtener unweildy bastante rápido. Un enfoque más inteligente siempre parece ser la respuesta, incluso si parece ser excesivo al principio. Empezaré con una clase base abstracta que contendrá una única variable entera llamada flags. Este entero simple puede contener 32 valores booleanos TRUE o FALSE. Otra cosa a considerar es simplemente establecer ciertos valores de BIT sin molestar a ninguno de los otros BITS - por lo que se incluye en la definición de clase la función setFlag (flag, value), que establecerá sólo el bit elegido. Heres la definición de la clase base abstracta: clase abstracta BitwiseFlag protected flags / Nota: estas funciones están protegidas para evitar que el código externo establezca falsamente BITS. Vea cómo el usuario de la clase que se extiende maneja esto. / Function protegida isFlagSet (flag) return ((este flag - gt flags amp flag) función protegida setFlag (valor de bandera) if (valor) this - gt flags flags else this - gt flags amp La clase anterior es abstracta y no puede ser Instanciado, por lo que se requiere una extensión. A continuación se muestra una simple extensión llamada User (Usuario), la cual está severamente truncada para mayor claridad. Tengo en cuenta que estoy definiendo variables const y métodos para usarlos. Clase El usuario extiende BitwiseFlag const FLAGREGISTERED 1 // BIT 1 de flags tiene el valor 1 const FLAGACTIVE 2 // BIT 2 de flags tiene el valor 2 const FLAGMEMBER 4 // BIT 3 de banderas tiene el valor 4 const FLAGADMIN 8 // BIT 4 de banderas tiene la función de valor 8 isRegistered pública () devuelva este - gt isFlagSet (auto. FLAGREGISTERED) isActive función pública () devuelva este - gt isFlagSet (auto. FLAGACTIVE) IsMember función pública () devuelva este - gt isFlagSet (auto. FLAGMEMBER ) isAdmin función pública () devuelva este - gt isFlagSet (auto. FLAGADMIN) la función pública setRegistered (valor) esta setflag - gt (auto. FLAGREGISTERED. valor) la función pública setActive (valor) esta setflag - gt (auto. FLAGACTIVE. valor) Public function setMember (valor) this - gt setFlag (self. FLAGMEMBER. Valor) public function setAdmin (valor) this - gt setFlag (auto. FLAGADMIN valor) public function toString () return Usuario. (Este - gt esRegistered ()) REGISTRADO.). (Este - gt esActive () ACTIVE). (Este miembro es miembro). (Este - gt esAdmin (). ADMIN.). Esto parece un montón de trabajo, pero hemos abordado muchas cuestiones, por ejemplo, el uso y mantenimiento del código es fácil, y la obtención y configuración de valores de bandera tienen sentido. Con la clase User, ahora puede ver cómo se convierten las operaciones de bandera bit a bit fáciles e intuitivas. usuario nuevo usuario () user - gt setRegistered (verdadero) user - gt setActive (verdadero) user - gt setMember (verdadera) - gt usuario setAdmin (verdadera) user eco // Salida: REGISTRADO usuario miembro activo grxnslxves13 ADMIN zlel en hotmail punto com Me refiero a Eric Swansons puesto en la implementación de Perl VS PHP de xor. En realidad, esto no es un problema con la implementación de XOR, sino mucho más que ver con la política de perder-escribir que PHP adopta. Cambiar libremente entre int y float es bueno para la mayoría de los casos, pero los problemas ocurren cuando su valor está cerca del tamaño de la palabra de su máquina. Es decir, las máquinas de 32 bits encontrarán problemas con valores que flotan alrededor de 0x80000000, principalmente porque PHP no admite enteros sin signo. El uso de bindec / decbin abordaría este problema como un trabajo para hacer unsigned-int xor, pero heres la imagen real (no estoy reclamando que este código funcionará mejor, pero este sería un mejor código pedagógico): function unsignedxor32 (a B) a1 a amp 0x7FFF0000 a2 a amp 0x0000FFFF a3 a amp 0x80000000 b1 b amp 0x7FFF0000 b2 b amp 0x0000FFFF b3 b amp 0x80000000 c (a3 b3). 0x80000000. 0 retorno ((a1 b1) (a2 b2)) cx 3851235679 y 43814 echo ltbrgtThis es el valor que queremos eco ltbrgt3851262585 eco resultado ltbrgtThe de una operación XOR nativo en valores enteros se trata como un ltbrgt eco entero con signo. (Xy) echo ltbrgtWe Por lo tanto, realizar el MSB por separado echo ltbrgt. Unsignedxor32 (x, y) Esto es realmente un material de fundación, pero para aquellos de ustedes que se perdió esto en la universidad, parece que hay algo en complemento 2s aquí: Inicialmente, encontré el bitmasking para ser un concepto confuso y no encontré uso para ello. Así que he azotado este fragmento de código en caso de que alguien más se confunde: // Los diversos detalles de un vehículo puede tener hasFourWheels 1 hasTwoWheels 2 hasDoors 4 8 bicicleta hasRedColour hasTwoWheels golfBuggy hasFourWheels vado hasFourWheels hasDoors Ferrari hasFourWheels hasDoors hasRedColour isBike hasFourWheels amp moto Falso, porque bicicleta doenst tener cuatro ruedas isGolfBuggy hasFourWheels amp golfBuggy cierto, porque golfBuggy tiene cuatro ruedas isFord hasFourWheels Ford amp cierto, porque Ford hasFourWheels y se puede aplicar esto a muchas cosas, por ejemplo, la seguridad: // Los permisos de seguridad: 1 writePost readPost 2 deletePost 4 addUser 8 deleteUser 16 // Los grupos de usuarios: administrador de la función writePost readPosts deletePosts addUser deleteUser moderador readPost deletePost deleteUser escritor writePost readPost huésped readPost // para comprobar si la función permiso checkPermission (usuario permiso.) Si (amp permiso del usuario) return true demás return false // Ahora aplicamos todo esto si (checkPermission (administrator. DeleteUser)) deleteUser (Some User) Esto se ejecuta porque el administrador puede deleteUser Una vez que usted consigue su cabeza alrededor de él, su muy útil Apenas recuerde levantar cada valor por el poder de dos para evitar problemas Apenas una nota con respecto a valores negativos del cambio, como el La documentación indica que cada desplazamiento es un número entero multiplicado o dividido (izquierda o derecha respectivamente) por 2. Esto significa que un valor de cambio negativo (el operando de la mano derecha) efectúa el signo del cambio y NO la dirección del cambio como habría esperado. FE. gtgt 0xff -2 resultados en 0x0 y LTLT 0xff -2 resultado en 0xFFFFFFFFC0000000 (dependiente de PHPINTMAX) En cuanto a lo que dijo Bob acerca de las marcas, Id les gusta señalar theres una manera segura 100 de definición de banderas, que está usando la notación hexadecimal para los números enteros: ltphp Definir (f0. 0x1) // 20 definir (f1. 0x2) // 21 definir (f2. 0x4) // 22 definir (f3. ) // 25 //. Define (f20. 0x1000000) // 220 define (f21. 0x2000000) // 221 define (f22. 0x4000000) // 222 define (f23. 0x8000000) // 223 define (f24. 0x10000000) // 224 //. Hasta 231 gt Siempre evito usar la notación decimal cuando tengo una gran cantidad de banderas diferentes, porque es muy fácil de escribir mal nombres como 220 (1048576). Perl vs PHP implementación del operador: Después de intentar traducir un módulo de Perl en PHP, me di cuenta de que la implementación de Perls del operador es diferente a la implementación de PHP. De forma predeterminada, Perl trata las variables como flotantes y PHP como números enteros. Pude comprobar el uso de PHP del operador indicando el uso del entero dentro del módulo de Perl, que emiten exactamente el mismo resultado que PHP estaba utilizando. La decisión lógica sería emitir cada variable como (float) cuando se utiliza el operador en PHP. Sin embargo, esto no dará los mismos resultados. Después de una media hora de golpear mi cabeza contra la pared, descubrí una joya y escribí una función usando las conversiones decimal binario en PHP. / No tener mucha experiencia con las operaciones bit a bit, no puedo decirle que esta es la mejor solución, pero sin duda es una solución que finalmente funciona y siempre devuelve el EXACTO mismo resultado Perl proporciona. / Binxor de función (a, b) return bindec (decbin ((float) a (flotante) b)) // código PHP normal no yeild el mismo resultado que Perl resultado 3851235679 43814 // -443704711 // para obtener el mismo resultado Como resultado de Perl binxor (3851235679, 43814) // 3851262585 // YIPPEE. // Para ver las diferencias, intente lo siguiente un XOR 3851235679 3851235679 43814 b 43814 // resultado entero c (float) 3851235679 (float) 43814 // igual que binxor bd (3851235679, 43814) // igual que Perl Este es un ejemplo Para bit a bit leftrotate y rightrotate. Tenga en cuenta que esta función sólo funciona con números decimales - otros tipos se pueden convertir con pack (). Rotación (decimal bits) binaria decbin (decimal) return (bindec (substr (bits binarios)) // Girar 124 (1111100) a la izquierda con 1 bits echo rotate (124 (124. - 3) Para aquellos que buscan una función circular de desplazamiento de bit en PHP (especialmente útil para funciones criptográficas) que funciona con valores negativos, Aquí es una pequeña función que escribí: (Nota: me tomó casi un día entero para conseguir que esto funcione con valores negativos num (no podía entender por qué a veces funcionaba y otras veces no), porque PHP sólo tiene un arithmatic y no Un desplazamiento a la derecha bitwise a la derecha como estoy acostumbrado a Ie 0x80000001gtgt16 se saldrá (en binario) 1111 1111 1111 1111 1000 0000 0000 0000 en lugar de 0000 0000 0000 0000 1000 0000 0000 0000 como se esperaría. Máscara (por bit amperio) igual a 0x7FFFFFFF desplazado a la derecha un menos que el desplazamiento que está cambiando por.) Función ltphp circularshift (núm. Máscara para cubrir el hecho de que PHP sólo hace arithmatic cambios a la derecha y no lógica, es decir, PHP no da la salida esperada cuando el desplazamiento a la derecha valores negativos si (offset gt 0) num (número ltlt desplazamiento 32 ) () () () () () () () () () () () () () () () (32 - offset 32)) return num gt Observe que los operadores de cambio son aritméticos, no lógicos como en C. Puede obtener resultados inesperados con números negativos, consulte en. wikipedia. org/wiki/ La operación de bitwise tiene una función para hacer cambios a la derecha lógica. función lshiftright (. var AMT) máscara 0x40000000 si (var lt 0) var amp 0x7FFFFFFF máscara de la máscara gtgt (AMT - 1).. retorno (var gtgt AMT) printf retorno máscara var gtgt AMT (desplazamiento aritmético en un integerltbrgt1032bltbrgt2032bltbrgt10dltbrgt20dltbrgt negativo val gtgt val (... cambio de lógica en un integerltbrgt1032bltbrgt2032bltbrgt10dltbrgt20dltbrgt negativo val lshiftright (val 1) 1) printf) printf (.. cambio de lógica en un integerltbrgt1032bltbrgt2032bltbrgt10dltbrgt20dltbrgt positivo, - val lshiftright (- val 1)) gt da la salida: desplazamiento aritmético en un negativo número entero 11111111111111111111111111110110 11111111111111111111111111111011 turno -10 -5 lógica en un entero negativo 11111111111111111111111111110110 01111111111111111111111111111011 -10 2147483643 cambio de lógica en un número entero positivo 00000000000000000000000000001010 00000000000000000000000000000101 10 5 Say. Realmente quieres tener decir. Más de 31 bits disponibles para usted en su bitmask feliz. Y usted no quiere utilizar flotadores. Por lo tanto, una solución sería tener una matriz de máscaras de bits, que se accede a través de algún tipo de interfaz. Aquí está mi solución para esto: Una clase para almacenar una matriz de enteros que son las máscaras de bits. Puede contener hasta 66571993087 bits y libera las máscaras de bits no utilizadas cuando no hay bits almacenados en ellas. Ltphp / bits infinitos y manejo de bits en general. No infinito, lo siento. Percebiblemente, el único límite a la clase de máscara de bits en el almacenamiento de bits sería el límite máximo del número de índice, en sistemas enteros de 32 bits 231 - 1, por lo que 231 31 - 1 66571993087 bits, suponiendo que los flotadores son de 64 bits o algo así. Estoy seguro de que es suficiente bastante pedacitos para cualquier cosa. Esperaba. / DEFINE (INTEGERLENGTH.31) // Estúpido bit firmado. Bit de bits de clase bitmask protegido bitmask array () conjunto de funciones públicas (bit) // Establece una clave de bit (int) (bit / INTEGERLENGTH) bit (int) fmod (bit INTEGERLENGTH) this - gt bitmask key 1 ltlt bit public function remove (bit ) // Borrar una clave de bits (int) (bit / INTEGERLENGTH) bit (int) fmod (bit INTEGERLENGTH) esta - gt bitmask key amp (1 bit ltlt) llave) la función pública de palanca (bits) // toggle alguna clave bit (int) (bit / INTEGERLENGTH) bit (int) HOQF (bits. INTEGERLENGTH) - gt esta máscara de bits clave bit 1 LTLT si (esta clave de máscara de bits - gt) configurada ( (Bit) INICIAR INICIO INICIO INICIO INICIO INICIO INICIO INICIO INICIO INICIO INICIO () Stringin (string) // Lee una cadena de bits que pueden llegar hasta la cantidad máxima de bits. This - gt bitmask array () array strsplit (strrev (cadena), INTEGERLENGTH) foreach (matriz como clave gt valor) if (valor bindec (strrev (valor))) Una cadena de sus pequeños bits pequeños string keys arraykeys (este - gt bitmask) sort (keys - SORTNUMERIC) for (i arraypop (keys) i gt 0 i -) si (este - gt bitmask i) cadena. Sprintf (0. INTEGERLENGTH b) this - gt bitmask i) devuelve la cadena public function clear () // Purge this - gt bitmask array () public function debug () // Ver lo que sucede en tu bitmask array vardump (this - Gt bitmask) gt Trata una entrada entera positiva como un bit, así que no tienes que lidiar con los poderes de 2 tú mismo. ltphp máscara de bits nueva máscara de bits () máscara de bits conjunto - gt (8979879) // Lo que - gt máscara de bits fija (888) si (máscara de bits - gt leer (888)) imprimir Happyn máscara de bits de palanca - gt (39393) // bla bla máscara de bits - gt quitar (888) bitmask - gt debug () bitmask - gt stringin (100101000101001000101010010101010 00000001000001) imprimir bitmask - gt stringout (). N bitmask - gt debug () bitmask - gt clear () bitmask - gt debug () gt Herere mis operaciones de descarte de 32 bits para aquellos de ustedes que portan algoritmos de cifrado de C. Tenga en cuenta que algunos de estos no son muy eficientes comparados A las operaciones nativas, especialmente cuando son llamados por algoritmos de encriptación de servicio pesado - pero no descartar el bit de transporte no puede aterrizar los mismos resultados que se obtiene en C, simplemente porque las operaciones de bits de PHP no fueron diseñadas para trabajar en registros de tamaño fijo. (Si su bit de cifrado portado todavía le da los mismos resultados, recuerde comprobar su función Endian) BFSHR32 (x, bits) if (bits0) devuelve x si (bits32) devuelve 0 y (x amp 0x7FFFFFFF) gtgt bits if (0x80000000 amp x) y (1ltlt (31-bits)) retorno y función BFSHL32 (x, bits) if (bits0) devuelve x si (bits32) devuelve 0 máscara (1ltlt (32 bits) máscara amp) bits de LTLT) amp función 0xFFFFFFFF BFGETBYTE (x, y) volver BFSHR32 (x, 8 y) amp función 0xFF BFOR32 (x, y) de retorno (xy) amp 0xFFFFFFFF función BFADD32 (x, y) xx amp 0xFFFFFFFF yy amp 0xFFFFFFFF total de 0 acarreo 0 para (i0 ilt4 i) BFGETBYTE bytex (x, i) bytey BFGETBYTE (y, i) suma bytex bytey resultado suma amp 0xFF arrastre BFSHR32 (suma, 8) BFSHR32 result suma acarreo suma amp 0xFF acarreo arrastre ( Si, como yo, nunca has pensado en cómo PHP se ocupa de binario, la salida del bit a bit NO puede confundirte. Por ejemplo, esto: echo Bin:. Decbin (bin). Bin Decbin (notbin). N Bin: 10 bin: 1111111111111111111111111111111111111111111111111111111111111101 La razón es que todos los números binarios se tratan como 32 bits, incluso si has introducido manualmente menos. Para obtener el resultado esperado (01), fue necesario Y el resultado con el número de bits que quería: en este caso, 2 (el número 3, en decimal). Tenga en cuenta que todos los valores devueltos tendrán ceros eliminados de la izquierda hasta que alcancen un bit que está establecido en 1. Siguiendo el ejemplo anterior, lo siguiente: bin amp 3 echo bin amp 3:. Decbin (notbin2). N Tenga en cuenta que el valor real era una cadena de 31 ceros seguida por un 1, pero los ceros no se mostraron. Esto es probablemente una buena cosa. Además, el operador NOT utiliza dos complementos, lo que significa que el número que obtiene puede ser aún más extraño de lo que usted espera: el uso de dos complementos significa que 2 -3. Hay un montón de buenas explicaciones de dos complementos en línea, así que no voy a entrar en esa pregunta aquí. Si lo que quieres es simplemente invertir una cadena de bits sin ninguna interpretación, puedes usar una función como ésta: Toma una cadena binaria de cualquier longitud, invierte los bits y devuelve la nueva cadena. A continuación, puede tratarlo como un número binario, use bindec () para convertirlo en un decimal, o lo que quieras. Espero que esto ayude a alguien tanto como me hubiera ayudado hace una semana. Ejemplo de función que utiliza operaciones bit a bit para convertir el color hexadecimal (normalmente dado como 6 dígitos hexadecimales, en enteros RGB separados) hex hex (hex) // cadena hexadecimal a valor decimal r dec amp hexdec (FF0000) // Máscara para red g dec amp hexdec (00FF00) // Máscara para verde b dec amp hexdec (0000FF) // Máscara para matriz de retorno azul (r gtgt 16. G gtgt 8. b) // Cambiar a la derecha a la derecha de cada color desde su posición original gt ltphp rgb hex2rgb (112233) eco rojo:. Rgb 0. N eco verde:. Rgb 1. N eco azul:. Rgb 2. N gt rojo: 17 verde: 34 azul: 51 desde: dechex (17) 11 dechex (34) 22 dechex (51) 33 Tenga mucho cuidado cuando XOR-ing cadenas Si uno de los valores está vacío (0,, null) el El resultado también estará vacío ltphp vardump (1234 0) // int (1234) vardump (1234) // int (1234) vardump (1234 null) // int (1234) vardump (hola mundo 0) // int (0) Vardump (hello world) // cadena (0) vardump (hello world null) // int (0) gt Esto parece un comportamiento bastante incoherente. Un entero XORd con cero produce el entero original. Pero una cadena XORd con un valor vacío da como resultado un valor vacío. Mi función hash de contraseña siempre devolvió el mismo hash. Debido a que estaba XOR-ing con una sal que a veces estaba vacío Aquí es una manera fácil de usar la operación a bit para la funcionalidad de bandera. Con esto quiero decir administrar un conjunto de opciones que pueden estar activadas o desactivadas, donde se pueden establecer cero o más de estas opciones y cada opción sólo se puede establecer una vez. (Si está familiarizado con MySQL, piense en establecer el tipo de datos). Nota: para los programadores más antiguos, esto será obvio. Aquí está el código: ltphp función setbitflag (/ variable-longitud args /) val 0 foreach (funcgetargs () como bandera) val val bandera return val función isbitflagset (val. Flag) (MYFLAGONE. 1) // 0001 define (MYFLAGTWO.2) // 0010 define (MYFLAGTHREE.4) // 0100 define (MYFLAGFOUR.8) // 1000 gt Debo señalar: sus banderas se almacenan en un Entero único Puede almacenar cargas de banderas en un solo entero. Para usar mis funciones, digamos que querías establecer MYFLAGONE y MYFLAGTHREE, usarías: ltphp myflags setbitflags (MYFLAGONE. MYFLAGTHREE) gt Nota: puedes pasar setbitflags () como muchos indicadores para establecer como quieras. Si desea probar más tarde si se establece un determinado flag, utilice por ejemplo: ltphp if (isbitflagset (myflags. MYFLAGTWO)) echo MYFLAGTWO está configurado gt La única parte difícil es definir sus banderas. Aquí está el proceso: 1. Escriba una lista de sus banderas 2. Cuente 3. Defina la última bandera en su lista como 1 veces 2 a la energía de ltcountgt menos uno. (I. E. 12 (ltcountgt-1)) 3. Trabajando hacia atrás a través de su lista, de la última a la primera, definir cada uno como la mitad de la anterior. Usted debe alcanzar 1 cuando usted consigue a la primera Si usted quiere entender números binarios, pedacitos y operación bitwise mejor, la página de la wikipedia lo explica bien - es. wikipedia. org/wiki/Bitwiseoperation. Esperemos que esto pueda ayudar a alguien a entender la diversión de los operadores de Bitwise. El propósito de esta función es devolver un valor desde el GPC (Get, Post y Cookie) y hacer algún formato básico en función del valor VALIDATION: function RETURNSUBMITTEDVALUE (VARIABLE. METHOD. VALIDATION) si (METHOD POST) if (isset (POST VARIABLE)) POST VARIABLE VALOR POST VARIABLE elseif (MÉTODO COOKIE) if (isset (COOKIE VARIABLE)) COOKIE VARIABLE VALOR COOKIE VARIABLE else if (isset (GET VARIABLE)) OBTENER VARIABLE VALOR GET VARIABLE if (iniget (magicquotesgpc) true) (VALIDATION amp 2) 2) VALUE striptags (VALUE) if ((VALIDATION amp 2) VALOR (VALIDATION amp 8) VALOR (VALIDATION amp 8) VALIDATION amp 1) 1) VALUE ajuste (VALUE) echo RETURNSUBMITTEDVALUE (ID. GET. 8). Ltbr / gt // Convierte a un eco entero RETURNSUBMITTEDVALUE (NAME. GET. 3). Ltbr / gt // Recortar espacios en blanco y tirar etiquetas HTML echo RETURNSUBMITTEDVALUE (GENDER. GET. 6). Ltbr / gt // Eliminar etiquetas HTML y convertirlas en minúsculas Para aquellos que no entienden binario, los números que ve no son aleatorios, duplican cada vez (1, 2, 4, 8, 16, 32, 64, 128, 256 , 512, 1024.) que le permite mezclar y combinar la función diferente, por ejemplo. 1 2 3 (Trim Whitespace Strip HTML) 2 4 6 (Eliminar HTML Convertir a minúsculas) No olvide los ceros a la izquierda. Su muy importante si desea escribir una función similar a las instrucciones de montaje ror y rol (Girar a la derecha y girar a la izquierda), debido a dword valor girar el binario siempre toma 32 posiciones e incluye los ceros a la izquierda Así que esta es la manera correcta : Function rotate (decimal, bits) binario decbin (decimal) binario strpad (binario 32.) STRPADLEFT) return (bindec (substr (bits binarios. Después de esta operación: edx 0x6c1bf561 (binario: 1101100000110111111010101100001) Pero su código devuelve 0x0d9bf561 (binario: 1101100110111111010101100001) Para obtener el valor correcto tiene que agregar los ceros a la izquierda añadiendo esa línea con strpad () (véase más arriba). Muy importante encontré la limitación de 31 bits en el bitwise ands para ser un poco frustrante en aplicaciones de control de permisos a gran escala. Tengo una situación que implica el acceso a nivel de página con más de 50 páginas. Yo era capaz de contornar la limitación agregando un bucle que dejaba caer 31 bits fuera de la derecha hasta que el bit del identificador de recurso estuviera dentro del primer 31. ltphp userlevel session - gt userlevel-0 la substracción asegura int type pgcode pow (2, (pgid (2.31) userlevel / pow (2.31) if ((userlevel - 0 amp pgcode)) si no está autorizado, muestre el encabezado de página no autorizada (pgcode gt 2147483648) pgcode pgcode / pow (Ubicación: Unauthorized. php) exit gt La siguiente función realizará un desplazamiento a la izquierda de 32 bits en una máquina de 64 bits: ltphp function leftshift32 (número. bases) decbin binario (número). Strrepeat (0. pasos) binario strpad (binario 32. 0. STRPADLEFT) binario substr (binario. Strlen (binario) - 32) return binario 1. - (pow (2.31) )). Bindec (binario) gt

No comments:

Post a Comment