0x70 Binary Options


Weve golpeó un problema donde no podemos seleccionar algunos registros a través de nuestra aplicación de ventas para cambiar la dirección. He encontrado que se debe a caracteres de 0x00 en el registro en lugar de 0x. La forma en que se escribe el código de la aplicación sigue diciendo que el registro ya ha sido cambiado desde la carga. p. ej. El código de abajo divide la ciudad del campo en caracteres individuales convertidos a varbinary como su única forma de Ive encontrado puedo mostrar el problema: select city, cast (substring (city, 1,1) como varbinary), cast (substring (city, ), Cast (substring (ciudad, 3,1) como varbinary), cast (subcadena (ciudad, 4,1) como varbinary) Cast (substring (ciudad, 6,1) como varbinary), cast (subcadena (ciudad, 7,1) como varbinary) 1) como varbinary), cast (substring (ciudad, 10,1) como varbinary), cast (substring (ciudad, 11,1) como varbinary) Subcadena (ciudad, 13,1) como varbinary), cast (subcadena (ciudad, 14,1) como varbinary) Como varbinary), cast (substring (ciudad, 17,1) como varbinary), cast (subcadena (ciudad, 18,1) como varbinary) ), Cast (substring (ciudad, 21,1) como varbinary), cast (subcadena (ciudad, 22,1) como varbinary) ), Cast (substring (ciudad, 24,1) como varbinary), cast (subcadena (ciudad, 25,1) como varbinary) (Subcadena (ciudad, 29,1) como varbinary), cast (subcadena (ciudad, 29,1) como varbinary) TAddress donde customerno gt 380180 y customerno lt 380184 y AddressType 3 Devuelve: Cambridgeshire 0x43 0x61 0x6D 0x62 0x72 0x69 0x64 0x67 0x65 0x73 0x68 0x69 0x72 0x65 0x20 0x20 0x20 0x20 0x20 0x20 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 Stockport 0x53 0x74 0x6F 0x63 0x6B 0x70 0x6F 0x72 0x74 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x Nantwich 0x4E 0x61 0x6E 0x74 0x77 0x69 0x63 0x68 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0x 0x 0x 0x 0x 0x 0x Por encima de Cambridgeshire es el disco roto que quiero arreglar, los otros dos están ahí para ejemplos de registros correctos. Lo que estoy interesado en hacer es buscar en el último dígito. Si es 0x00, devuelva el registro. Esto suena fácil, pero no he encontrado una manera de buscar en este valor varbinary 0x00. La secuencia de comandos a continuación vuelve tanto 0x y 0x00 seleccionar addressno, customerno, yeso (subcadena (ciudad, 30,1) como varbinary) como corrector, desde donde TAddress customerno gt 380180 y 380184 y customerno lt molde (subcadena (ciudad, 30,1) Como varbinary) 0x00 Si guardo esta salida como un archivo y reimporta el valor binario como nvarchar, puedo buscar los valores 0x00 entonces, pero debe haber una mejor manera de hacerlo. Cualquier persona cualquier sugerencia Para guardar la creación de una tabla y la inserción de los datos, lo he hecho a continuación. Esperemos que pueda copiar y pegar. BEGIN TRANSACTION SET QUOTEDIDENTIFIER EN ARITHABORT SET EN CONJUNTO NUMERICROUNDABORT OFF SET CONCATNULLYIELDSNULL EN ANSINULLS SET en SET ANSIPADDING EN CONJUNTO ANSIWARNINGS al confirmar BEGIN TRANSACTION GO CREATE TABLE dbo. TADDRESS (varchar de la ciudad (30) NULL) GO EN PRIMARIA COMMIT inserción en TAddress selecciona la izquierda ( (Char, 0x6), 1) izquierda (convertir (char, 0x6), 1) izquierda (convertir (char, 0x6) , 1) izquierda (convertir (char, 0x65), 1) izquierda (convertir (char, 0x64), 1) izquierda (Char, 0x72), 1) izquierda (convertir (char, 0x68), 1) a la izquierda (convertir (char, 0x65), 1) 1) izquierda (convertir (char, 0x20), 1) izquierda (convertir (char, 0x20), 1) izquierda (convertir (char, 0x20) 0x20), 1) izquierda (convertir (char, 0x20), 1) izquierda (convertir (char, 0x00), 1) izquierda Izquierda (convertir (char, 0x00), 1) izquierda (convertir (char, 0x00), 1) izquierda (convertir (char, 0x00) , 0x00), 1) a la izquierda (convertir (char, 0x00), 1) a la izquierda (convertir (char, 0x00), 1) insertar en TAddress seleccionar la izquierda (convertir (char, 0x53), 1) a la izquierda (convertir (char, 0x74 ), 1) izquierda (convertir (char, 0x6F), 1) a la izquierda (convertir (char, 0x6), 1) a la izquierda Convertir (char, 0x6F), 1) a la izquierda (convertir (char, 0x2), 1) izquierda (convertir (char, 0x74), 1) insertar en TADDRESS seleccionar a la izquierda 0x6), 1) izquierda (convertir (char, 0x6E), 1) izquierda (convertir (char, 0x74), 1) izquierda ) Left (convert (char, 0x63), 1) left (convert (char, 0x68), 1) selecciona de TADDRESS ¿Conseguiste acceso denegado Great the security works. No fue 0x me interesaba, que era 0x00, pero su sugerencia anterior funcionaba bien: seleccionar, DATALENGTH (molde (subcadena (ciudad, 30,1) como varbinary)) a partir de TAddress devuelve 1 con el registro donde hay algo como el 30 de caracteres: Cambridgeshire 1 Stockport 0 0 Nantwich Ive acaba de intentar mi consulta y su devuelto al otro puñado de registros ofensivos: seleccionar addressno, customerno, yeso (subcadena (ciudad, 30,1) como varbinary) como la ciudad, DATALENGTH (molde (subcadena (ciudad, 30,1) como varbinary)) como Datal de TAddress donde DATALENGTH (molde (subcadena (ciudad, 30,1) como varbinary)) 0 y elenco (subcadena (ciudad, 30,1) como varbinary) 0x00 Gracias por Su ayuda ¿Tienes acceso denegado Gran la seguridad works. From OSDev Wiki CMOS es un pequeño pedazo de memoria estática de muy baja potencia que vive en el mismo chip que el reloj en tiempo real. Es bastante conveniente pensar realmente en el RTC como parte de CMOS. CMOS (y el reloj en tiempo real) sólo se puede acceder a través de los puertos IO 0x70 y 0x71. La función de la memoria CMOS es almacenar 50 (o 114) bytes de información de configuración para el BIOS mientras el equipo está apagado - porque hay una batería separada que mantiene activa la información de reloj y CMOS. Los valores CMOS se acceden a un byte a la vez, y cada byte es individualmente direccionable. Cada dirección CMOS es tradicionalmente llamada un registro. Los primeros 14 registros CMOS acceden y controlan el reloj en tiempo real. De hecho, los únicos registros verdaderamente útiles que quedan en CMOS son los registros de reloj en tiempo real, y registran 0x10. Todos los demás registros en CMOS son casi completamente obsoletos (o no están estandarizados), y por lo tanto son inútiles. Contenido Interrupciones no mascarables Para la frugalidad en los viejos tiempos, muchas funciones se fusionaron en chips donde había espacio - incluso si no pertenecían juntos. Un ejemplo es poner la habilitación de dirección A20 en el controlador de teclado PS2. De la misma manera, el control de deshabilitación de NMI se puso junto con el controlador CMOS y el reloj en tiempo real. NMI está destinado a comunicar un estado de pánico desde el hardware a la CPU de una manera que la CPU no puede ignorar. Se suele utilizar para señalar errores de memoria. Para obtener más información acerca de NMI, consulte el artículo NMI. Siempre que envíe un byte al puerto IO 0x70, el bit de orden alto le indica al hardware si desea inhabilitar los NMIs para llegar a la CPU. Si el bit está activado, NMI está deshabilitado (hasta la próxima vez que envíe un byte al puerto 0x70). Los 7 bits de orden inferior de cualquier byte enviado al puerto 0x70 se utilizan para dirigir los registros CMOS. Registros CMOS El mapa de registro CMOS más actualizado, que muestra todas las definiciones de registro en conflicto entre los distintos BIOS, está en RBIL en el archivo denominado CMOS. LST. Acceso a los registros CMOS El acceso a CMOS es extremadamente simple, pero siempre debe tener en cuenta cómo desea manejar NMI. Seleccione un registro CMOS (para leer o escribir) enviando el número de registro al puerto IO 0x70. Dado que el bit 0x80 del puerto 0x70 controla NMI, siempre termina configurándolo. Por lo tanto, su controlador CMOS siempre necesita saber si su sistema operativo desea que NMI esté habilitado o no. La selección de un registro CMOS se realiza de la siguiente manera: outb (0x70, (NMIdisablebit ltlt 7) (número de registro CMOS seleccionado)) Una vez seleccionado un registro, puede leer el valor de ese registro en el puerto 0x71 (con inb o una función equivalente) , O escribir un nuevo valor en ese registro - también en el puerto 0x71 (con outb, por ejemplo): Nota1: lectura o escritura Puerto 0x71 parece predeterminar el registro seleccionado de nuevo a 0xD. Por lo tanto, debe volver a seleccionar el registro cada vez que desee acceder a un registro CMOS. Nota2: Probablemente es una buena idea tener un retraso razonable después de seleccionar un registro CMOS en el puerto 0x70, antes de leer / escribir el valor en el puerto 0x71. Checksums El buen funcionamiento del BIOS durante el arranque depende de los valores en el CMOS. Por lo tanto, los valores están protegidos contra cambios aleatorios con sumas de comprobación. Es muy imprudente escribir un valor en cualquiera de los registros CMOS (excepto para el RTC), porque cuando cambia un valor también tiene que ir a fijar una suma de verificación específica de BIOS en un registro diferente, o bien el siguiente El arranque se bloqueará con un error de suma de comprobación no válido. Y puesto que la suma de comprobación se encuentra en un número de registro BIOS específico, buena suerte encontrándolo. Registro 0x10 Este registro contiene el único valor CMOS que un sistema operativo puede encontrar útil. Describe el tipo de cada una de las dos unidades de disquete que pueden estar conectadas al sistema. El nibble alto describe la unidad de disquete principal en el bus primario y el nibble bajo tiene una descripción idéntica para la unidad de disquete esclava. Valor de cada nibble de 4 bits y tipo de unidad de disquete asociada: Bits 0 a 3 tipo de disquete esclavo, bits 4 a 7 tipo de disquete maestro Registro de tamaño de memoria Existen varios registros CMOS que están estandarizados y que parecen informar información útil sobre el total Memoria en el sistema. Sin embargo, cada uno de ellos carece de información vital que su sistema operativo necesitará. Siempre es mejor usar una llamada de función BIOS para obtener información sobre la memoria que utilizar la información en CMOS. Consulte Detección de memoria (x86). (Registro 0x16 (byte alto)) Registro 0x15 (byte bajo)) ltlt 10 640K tamaño de memoria baja (sin tener en cuenta el EBDA) 16M, o tal vez 65M. En general, este número es extra poco confiable cuando el sistema tiene más de 64M, ignora los orificios de memoria, ignora el hardware asignado a la memoria, e ignora la memoria reservada para las tablas del sistema ACPI importantes (Registro 0x31 ) Registro 0x30 (byte bajo)) ltlt 16 memoria total entre 16M y 4G. Pero este número no es digno de confianza cuando el sistema tiene más de 4G, ignora los orificios de memoria, ignora el hardware asignado a la memoria, e ignora la memoria reservada para los archivos importantes Cuadros de sistema de ACPI Registros de disco duro Existen muchos registros de CMOS en varias ubicaciones, utilizados por varios BIOS antiguos, para almacenar un tipo de disco duro u otra información de disco duro. Esta información es estrictamente para uso en unidades de disco obsoletas basadas en CHS. La información siempre se puede obtener mediante la función BIOS INT13h AH8 o enviando un comando ATA Identify al disco en el modo ATA PIO. El reloj en tiempo real El RTC realiza un seguimiento de la fecha y la hora, incluso cuando la computadora está apagada. La única otra manera que una computadora solía ser capaz de hacer esto era preguntar a un ser humano para la fecha / hora en cada arranque. Ahora, si el equipo tiene una conexión a Internet, un sistema operativo tiene otra (posiblemente mejor) forma de obtener la misma información. El RTC también puede generar señales de reloj en IRQ8 (similar a lo que el PIT hace en IRQ0). La frecuencia de reloj más alta posible es 8KHz. El uso del reloj RTC de esta manera puede generar pulsos de reloj más estable que el PIT puede generar. También libera el PIT para eventos de temporización que realmente necesitan una precisión de cerca de los microsegundos. Además, el RTC puede generar un IRQ8 en una hora determinada del día. Consulte el artículo de RTC para obtener información más detallada sobre el uso de interrupciones RTC. Cómo obtener la fecha y hora actuales de RTC Para obtener cada uno de los siguientes valores de fecha y hora del RTC, primero debe asegurarse de que no se realizará mediante una actualización (consulte a continuación). A continuación, seleccione el registro CMOS asociado de la manera habitual. Y leer el valor del puerto 0x71. Century Register Originalmente el RTC no tenía un registro del siglo en absoluto. En la década de 1990 (a medida que el año 2000 se acercaba) los fabricantes de hardware comenzaron a darse cuenta de que esto podría convertirse en un problema para que comiencen a añadir registros del siglo a su RTC. Desafortunadamente, debido a que no había un estándar oficial a seguir, diferentes fabricantes usaron diferentes registros. Esto significó que el software no sabía si había un registro del siglo, y (si hay) qué registro podría ser. Para solucionar ese problema, la especificación ACPI incluía un campo de registro del siglo RTC en el desplazamiento 108 en su Tabla de descripción de ACPI fija. Si este campo contiene cero, entonces el RTC no tiene un registro de siglo, y si el campo es distinto de cero, entonces contiene el número del registro de RTC para usar durante el siglo. Si no hay registro del siglo entonces el software puede adivinar. Por ejemplo, una pieza de software escrita en 1990 puede utilizar el registro de año (2 dígitos) para determinar el siglo más probable - si el registro de año de RTC es mayor o igual a 90 entonces el año es probablemente 19YY y si el año RTC Registro es menos de 90 que el año debe ser 20YY. De esta manera, el software puede determinar correctamente el siglo hasta 99 años después de que el software se escribe. Si el CMOS / RTC tiene un registro del siglo, su software fue lanzado 2014, y el CMOS / RTC dice que el siglo y el año son 2008 entonces obviamente el CMOS / RTC debe estar incorrecto. Del mismo modo, las personas tienden a actualizar su sistema operativo ocasionalmente. Si el CMOS / RTC tiene un registro del siglo, su software fue lanzado 2014, y el CMOS / RTC dice que el siglo y el año son 2154, entonces es poco probable que el OS no ha sido actualizado por 140 años, y mucho más probable que el CMOS / RTC Está Mal. Esencialmente el método (descrito arriba) para adivinar el siglo cuando no hay registro del siglo es mucho más confiable que el registro del siglo de CMOS / RTC (si existe). Esto significa que el registro del siglo (si está disponible) se puede usar a la inversa, como una forma de comprobar si la hora y la fecha CMOS / RTC son sanas (o si el CMOS / RTC tiene una batería plana o algo parecido). Básicamente, youd adivinar el siglo (basado en la fecha de lanzamiento de softwares y año RTCs), a continuación, comprobar si el CMOS / RTC siglo es el mismo que su conjetura y si su no asumir todos los CMOS / RTC tiempo y los campos de fecha no son válidos. Registro de la semana El chip RTC es capaz de realizar un seguimiento del día actual de la semana. Todo lo que hace es incrementar su registro de la semana a medianoche y restablecerlo a cero si llega a 7. Desafortunadamente, no hay garantía de que este registro haya sido definido correctamente por nada (incluso cuando el usuario cambia la hora y la fecha usando la pantalla de configuración del BIOS) . Es enteramente no fiable y no debe ser utilizado. La forma correcta de determinar el día actual de la semana es calcularlo a partir de la fecha (consulte el artículo en Wikipedia para obtener detalles sobre este cálculo). Actualización de RTC en progreso Cuando el chip actualiza la hora y la fecha (una vez por segundo) aumenta los segundos y comprueba si se ha rolado. Si los segundos rodaron sobre él aumenta minutos y comprueba si eso rodó encima. Esto puede continuar a través de todos los registros de la hora y de la fecha (por ejemplo todo el camino hasta si el año rodó encima, aumento siglo). Sin embargo, la circuitería RTC es típicamente relativamente lenta. Esto significa que es completamente posible leer la hora y la fecha mientras se está realizando una actualización y obtener valores incómodos / incoherentes (por ejemplo, a las 9:00 de la mañana, puede leer 8:59 u 8:60 u 8:00, O 9:00). Para ayudar a protegerse contra este problema, el RTC tiene un indicador de Actualización en curso (bit 7 del Registro de Estado A). Para leer correctamente la hora y la fecha, debe esperar hasta que el indicador Actualizar en progreso pase de establecido a borrado. Esto no es lo mismo que comprobar que el indicador de Actualización en curso es claro. Por ejemplo, si el código hace while (updateinprogressflag160 clear) y comienza a leer todos los registros de hora y fecha, la actualización podría comenzar inmediatamente después de que el indicador Update in progress estuviera marcado y el código pudiera leer valores dudosos / inconsistentes. Para evitar esto, el código debe esperar hasta que el indicador se establezca y luego esperar hasta que el indicador se aclare. De esa manera hay casi 1 segundo de tiempo para leer todos los registros correctamente. Desafortunadamente, hacerlo bien (esperar hasta que el indicador de Actualización en curso se fije y luego esperar hasta que se vuelva claro) es muy lento; puede tardar un segundo entero de espera / sondeo antes de poder leer los registros. Hay 2 alternativas. La primera alternativa es confiar en la interrupción de actualización. Cuando el RTC termina una actualización, genera una interrupción de actualización (si está habilitada) y el manejador de IRQ puede leer con seguridad los registros de hora y fecha sin preocuparse por la actualización en absoluto (y sin comprobar el indicador Actualizar en progreso) IRQ manejador no toma casi un segundo completo para hacerlo. En este caso, no está perdiendo hasta 1 segundo de tiempo de espera de la CPU / sondeo, pero todavía puede tomar un segundo completo antes de que se haya leído la fecha y la hora. A pesar de esto, puede ser una técnica útil durante el inicio del sistema operativo, p. Configurar la interrupción de actualización y su controlador IRQ tan pronto como sea posible y luego hacer otras cosas (por ejemplo, cargar archivos desde el disco), con la esperanza de que la IRQ se produce antes de que necesite la hora y la fecha. La segunda alternativa es prepararse para valores dudosos / inconsistentes y hacerles frente si ocurren. Para ello, asegúrese de que el indicador de Actualización en curso es claro (p. Ej. While (updateinprogressflag160 clear)) y luego lea todos los registros de hora y fecha, Todos los registros de hora y fecha de nuevo. Si los valores leídos la primera vez son iguales al valor leído la segunda vez, los valores deben ser correctos. Si alguno de los valores es diferente, debe volver a hacerlo y continuar haciéndolo de nuevo hasta que los valores más recientes sean los mismos que los valores anteriores. Formato de Bytes Hay 4 formatos posibles para la fecha / hora Bytes de RTC: Modo Binary o BCD Horas en formato de 12 horas o formato de 24 horas El formato es controlado por el Registro de Estado B. En algunos chips CMOS / RTC, Reg B no se puede cambiar. Por lo tanto, su código debe ser capaz de manejar las cuatro posibilidades, y no debe intentar modificar la configuración de registro de estado Bs. Por lo tanto, siempre debe leer Status Register B primero, para averiguar en qué formato llegarán sus bytes de fecha y hora. Registro de estado B, Bit 1 (valor 2): Activa el formato de 24 horas si se establece Status Register B, Bit 2 4): Habilita el modo binario si está configurado El modo binario es exactamente lo que usted esperaría que fuera el valor. Si el tiempo es 1:59:48 AM, entonces el valor de horas sería 1, los minutos serían 59 0x3b, y los segundos serían 48 0x30. En el modo BCD, cada uno de los dos bits hexadecimales del byte se modifica para mostrar un número decimal. Así que 1:59:48 tiene horas 1, minutos 0x59 89, segundos 0x48 72. Para convertir BCD de nuevo en un buen valor binario, utilice: binary ((bcd / 16) 10) (bcd amplificador 0xf) Optimizado: binario (bcd Amp 0xF0) gtgt 1) ((bcd amp 0xF0) gtgt 3) (bcd amp 0xf). 24 horas de tiempo es exactamente lo que cabría esperar. Hora 0 es de medianoche a 1 am, hora 23 es 11 pm. 12 horas de tiempo es molesto para convertir de nuevo a 24 horas. Si la hora es pm, entonces el bit 0x80 se establece en el byte de hora. Así que necesitas enmascarar eso. (Esto es cierto para los modos binario y BCD). Entonces, la medianoche es 12, 1am es 1, etc. Tenga en cuenta que cuidadosamente: la medianoche no es 0 - es 12 - esto debe ser manejado como un caso especial en el Cálculo del formato de 12 horas al formato de 24 horas (mediante el ajuste de 12 de nuevo a 0) Para el formato de día de la semana: Domingo 1, Sábado 7. Interpretación de valores RTC En la superficie, estos valores de la RTC parece muy obvio. La principal dificultad viene al decidir qué zona horaria representan los valores. Las dos posibilidades son generalmente UTC, o la zona horaria de los sistemas, incluyendo ahorros de la hora de verano. Vea el artículo de Hora y fecha para una discusión mucho más completa sobre cómo manejar este problema. Ejemplos Lectura del CMOSGracias por ponerse en contacto conmigo. Ive añadido a la lista de contactos de GenoMeds, así que obtendrá comunicados de prensa como el que envié el 4 de marzo de 2010, cuando escuché por primera vez que la SEC había suspendido el comercio de nuestras acciones. La posición de SECs es bastante cortada y seca. Hemos archivado con ellos desde 2005, y su posición es que no deberíamos ser una empresa pública a menos que continuemos a archivar con ellos. Desafortunadamente, los auditores y los abogados de la SEC, por no mencionar los requisitos de Sarbannes-Oxley, nos costarían un extra de 100K aproximadamente al año. En este punto, simplemente no podemos permitirnos mantenerse al día con nuestros requisitos de presentación de la SEC. Espero que nuestra situación financiera cambie pronto, y podemos volver a registrarse con la SEC y reanudar el comercio en un intercambio público. Por el momento, no tenemos otra alternativa que continuar como una empresa no comercial, es decir privada, hasta que tengamos suficiente dinero para volver a registrarse con la SEC de nuevo y reanudar el comercio. No tengo ni idea de cuánto tiempo será. Sigo esperando que el mundo se entere de nuestra capacidad para prevenir 90 de diálisis y muy pronto tienen miles de pacientes que quieren que los mantenga fuera de diálisis. Pero eso no ha sucedido todavía. Sigo tratando de sacar la palabra todos los días, como muchos de ustedes. En cualquier caso, la SEC me asegura que la acción actual no afectará negativamente nuestras posibilidades de volver a registrarse con ellos una vez que nuestras finanzas han mejorado. Prometo mantenerlos informados tan de cerca, ahora que eran privados, como lo hice cuando éramos públicos. También prometo tratar a todos mis inversores de manera justa. Ive instruyó al agente de la transferencia de la acción para enviarme una lista de accionistas a partir del 3 de marzo de 2010 de modo que pueda cargar todos sus email en nuestra lista principal. Le agradecería que se pusiera en contacto conmigo, junto con el número de acciones que posee, para poder enviar noticias de la empresa cuando las envíe a todos los demás. POR FAVOR NO TIRE SU CERTIFICADO DE ACCIONES GENOMED Usted los necesitará para probar su inversión previa en la empresa. Todavía tienen valor. A pesar de que usted no puede intercambiarlos en un intercambio público como el Pink Sheets ya, es perfectamente legal para que usted los intercambie entre ustedes. Saludos cordiales, Dave Moskowitz MD Director Ejecutivo, GenoMed, Inc. 2001-2016 GenoMed. Todos los derechos reservados.

Comments