Tengo un problema con la recepción de datos binarios a través de WebSocket donde el número de bytes recibidos por el navegador (en forma de ArrayBuffer, en JavaScript) es mayor que lo que el servidor envía, a pesar de Chrome o Firefox informar correctamente cuántos bytes se transmitieron a través de la cable. El lado del servidor es Node JS, y he usado 3 paquetes diferentes (ws, nodejs-websocket y websocket) y todos se comportan igual. Así que es probable que el problema está en JavaScript que se ejecuta en el navegador. Mi código en el lado del cliente se ve así: El problema es que si examino la longitud del búfer (después de la línea 4), es más alto que los datos enviados desde el servidor. Por ejemplo, si el servidor envía el contenido binario, 8 bytes: en el lado del cliente, veo: UPDATE: después de un examen más, creo que esto tiene que ver con la alineación de la palabra de los datos en la memoria. Por ejemplo, si envío los datos siguientes: 0x7C 0x7D 0x7E 0x7F. Su recibido correctamente. Pero tan pronto como consumir bits más altos, como 0x81. El 0xc2 se agrega a los datos. No puedo creer que tengo que lidiar con esto Tal vez estoy haciendo algo mal, pero he mirar otros marcos para la transferencia de datos binarios a través de websocket y, de hecho, están desempaquetando los datos reales de un búfer de alineación alineada con palabras. UPDATE 2: Para los propósitos de finalización, esto es lo que está sucediendo en el servidor, utilizando el paquete NodeJS websocket. Donde conn es la conexión de socket web obtenida del paquete websocket. Gracias por tomarse el tiempo de leer esto. Tu ayuda es muy apreciada. Cuando imprima o escriba la corriente, cerciórese de utilizar la corriente de almacenador intermediario original, no la secuencia. En su caso puede imprimir cadena en lugar de buffer. Buf. toString () utiliza el codificador UTF-8 como valor predeterminado, y el carácter chino en UTF-8 toma 3bytes y luego obtienes bytes inesperados. Por cierto, 0xa1 es donde comienza el personaje chino Por favor, utilice iconv-lite para convertir la cadena de búfer si necesita O refiérase a esta entrada para combinar búfer en el lado del servidor Lo clavó. Ese era el problema. Gracias tan tan tan mucho. No se me ocurrió cuestionar el lado del servidor porque tanto Chrome como Firefox informaron el número de bytes recibidos igual a lo que esperaba. Pero tal vez eso es lo que cuentan los quotbytes tomando la codificación en cuenta. Otra vez, GRACIAS ndash raminr Nov 18 at 13: 32rawurldecode Hola a todos) Me llamo Javier y soy de Argentina. He tenido un pequeño problema con caracteres latinos como ,,,,, etc No se decodificaron con rawurlencode (), por lo que he hecho esto: ltphp función urlRawDecode (rawurlencoded) Hex mesa de conversión hextable array (0 gt 0x00, 1 gt 0x01, 2 gt 0x02, 3 gt 0x03, 4 gt 0x04, 5 gt 0x05, 6 gt 0x06, 7 gt 0x07, 8 gt 0x08, 9 gt 0x09, A gt 0x0a, B gt 0x0b, C gt 0x0c, D gt 0x0d, E gt 0x0e, F gt 0x0f) Problema de carácter latino de Fixin si (pregmatchall (/ C3 (A-Z0-9) / i. Rawurlencoded. res)) res arrayunique (res res 1) arrunicoded array () foreach (res como valor gt clave) Arrunicoded chr ((0xc0 (hextable substr (valor 0.1) ltlt 4)) (0x03 amplificador hextable substr (valor 1. 1))) res tecla C3. (Rawurlencoded) print urlRawDecode (C3A1C3B1) gt Por ejemplo, tiene el carácter codificado como este C3B1. Esto no es nada más y nada menos que 0xc3 y 0xb1, son números binarios, (HHHH LLLL, donde HHHHHigh y LLLLLow). 0xc3 1100 0011 (palabra binaria de 8 bits), 0xb1 1011 0001 (palabra binaria de 8 bits) Para convertir un carácter crudo codificado en ascii tenemos que realizar operaciones booleanas entre estos dos operandos (0xc3 y 0xb1), el álgebra booleana fue definida por George Boole, tenemos que usarlos aquí. El primero que vamos a utilizar es el OR lógico (o tubo) y AND lógico (amplificador o persona). Un OR lógico implica la siguiente tabla de verdad: ab (a OR b) 0 0 0 0 1 1 (a OR b o Both, a y b, deben ser verdaderos para obtener un resultado verdadero) 1 0 1 1 1 1 Un AND lógico Implica la siguiente tabla de verdad: ab (a AND b) 0 0 0 0 1 0 1 0 0 1 1 1 (Tanto a AND b, debe ser verdadero para obtener un resultado verdadero) Entonces, aquí tenemos que hacer un OR lógico Tanto 0xc3 como 0xb1 HIGH nibble, un nibble es un medio byte (4 bits), por lo que tenemos que hacer un OR lógico entre 1100 (0xc) y 1011 (0xb), vamos a obtener esto: 1111 (0xf), entonces nos Tenemos que hacer un AND lógico entre ambos LOW nibble, 0011 (0x3) y 0001 (0x1), vamos a obtener esto: 0001, así que, si queremos ver el resultado final, tenemos que poner alto y bajo nibble en su Posición de byte, como esto: 1111 0001 (0xf1) y eso es nada más y nada menos que (para comprobar esto, intente lo siguiente: print (chr (0xf1))). Este ltlt es un cambio lógico a la izquierda, si tenemos este número binario 0001 (1) y hacemos esto: 0001 ltlt 2 bien get 0100 (4) los bits correctos están llenos de 0s. Ltphp Ejemplo de conversión C3B1 a ASCII (0x71) print (chr (0xc0 0x0b ltlt 4) (0x03 amp 0x01))) // Salida será: // // 1100 0000 OR 1011 0000 1111 0000 (0xf0) // 0000 0011 Y 0000 0001 0000 0001 (0x01) // 1111 0000 O 0000 0001 1111 0001 (0xf1) PS: Lo siento mucho por mi inglés, lo sé, es horrible: P Hola a todos) Me llamo Javier e Im de Argentina. He tenido un pequeño problema con caracteres latinos como ,,,,, etc No se decodificaron con rawurlencode (), por lo que he hecho esto: ltphp función urlRawDecode (rawurlencoded) Hex mesa de conversión hextable array (0 gt 0x00, 1 gt 0x01, 2 gt 0x02, 3 gt 0x03, 4 gt 0x04, 5 gt 0x05, 6 gt 0x06, 7 gt 0x07, 8 gt 0x08, 9 gt 0x09, A gt 0x0a, B gt 0x0b, C gt 0x0c, D gt 0x0d, E gt 0x0e, F gt 0x0f) Problema de carácter latino de Fixin si (pregmatchall (/ C3 (A-Z0-9) / i. Rawurlencoded. res)) res arrayunique (res res 1) arrunicoded array () foreach (res como valor gt clave) Arrunicoded chr ((0xc0 (hextable substr (valor 0.1) ltlt 4)) (0x03 amplificador hextable substr (valor 1. 1))) res tecla C3. (Rawurlencoded) print urlRawDecode (C3A1C3B1) gt Por ejemplo, tiene el carácter codificado como este C3B1. Esto no es nada más y nada menos que 0xc3 y 0xb1, son números binarios, (HHHH LLLL, donde HHHHHigh y LLLLLow). 0xc3 1100 0011 (palabra binaria de 8 bits), 0xb1 1011 0001 (palabra binaria de 8 bits) Para convertir un carácter crudo codificado en ascii tenemos que realizar operaciones booleanas entre estos dos operandos (0xc3 y 0xb1), el álgebra booleana fue definida por George Boole, tenemos que usarlos aquí. El primero que vamos a utilizar es el OR lógico (o tubo) y AND lógico (amplificador o persona). Un OR lógico implica la siguiente tabla de verdad: ab (a OR b) 0 0 0 0 1 1 (a OR b o Both, a y b, deben ser verdaderos para obtener un resultado verdadero) 1 0 1 1 1 1 Un AND lógico Implica la siguiente tabla de verdad: ab (a AND b) 0 0 0 0 1 0 1 0 0 1 1 1 (Tanto a AND b, debe ser verdadero para obtener un resultado verdadero) Entonces, aquí tenemos que hacer un OR lógico Tanto 0xc3 como 0xb1 HIGH nibble, un nibble es un medio byte (4 bits), por lo que tenemos que hacer un OR lógico entre 1100 (0xc) y 1011 (0xb), vamos a obtener esto: 1111 (0xf), entonces nos Tenemos que hacer un AND lógico entre ambos LOW nibble, 0011 (0x3) y 0001 (0x1), vamos a obtener esto: 0001, así que, si queremos ver el resultado final, tenemos que poner alto y bajo nibble en su Posición de byte, como esto: 1111 0001 (0xf1) y eso es nada más y nada menos que (para comprobar esto, intente lo siguiente: print (chr (0xf1))). Este ltlt es un cambio lógico a la izquierda, si tenemos este número binario 0001 (1) y hacemos esto: 0001 ltlt 2 bien get 0100 (4) los bits correctos están llenos de 0s. Ltphp Ejemplo de conversión C3B1 a ASCII (0x71) print (chr (0xc0 0x0b ltlt 4) (0x03 amp 0x01))) // Salida será: // // 1100 0000 OR 1011 0000 1111 0000 (0xf0) // 0000 0011 PS: Im lo siento por mi inglés, lo sé, es horrible: PAdministering el almacenamiento seguro en el sistema de archivos (AS ABAP) Valor a ser Almacenado, que debe omitir al utilizar las opciones - valuefile o - binary. Para evitar problemas con páginas de códigos o conjuntos de caracteres, el contenido de este argumento es la representación UTF-8 del valor que se va a almacenar. Puede introducir directamente caracteres que están contenidos en el conjunto de caracteres ASCII. Debe introducir otros caracteres, por otro lado, como un código hexadecimal de dos caracteres, prefijado con un signo de porcentaje () como un carácter de escape. El nombre Jrgen contiene el umlaut alemán. Para lo cual la representación UTF-8 es 0xC3, 0xBC. El valor para la línea de comandos es entonces JC3BCrgen. Si tiene disponible un AS ABAP, puede utilizar el informe RSECSSFXESCAPE para dar soporte al crear un valor con los caracteres de escape correctos. Fin del ejemplo. El sistema almacena el valor sin cifrar. Esto afecta a los valores necesarios para conectarse a la base de datos, pero que no son sensibles, como el nombre de host o los parámetros de conexión. Si almacena valores sin cifrar, puede mostrarlos o extraerlos con el comando get. - valuefile lt nombre de archivo gt Con esta opción, el sistema no espera que el valor se almacene en el registro de datos como un argumento de comando, sino como el contenido del archivo especificado en la opción. Para valores de texto, el archivo debe contener el valor en formato UTF-8 y debe comenzar con la marca de orden de bytes UTF-8 correcta (0xEF, 0xBB, 0xBF). También debe contener caracteres distintos del valor que se va a almacenar, como saltos de línea o tabulaciones, si éstos no forman parte del valor real. Para valores binarios, el contenido debe tener la firma de un archivo PSE, a menos que se utilice - plain. Desactive la comprobación de marca de orden de bytes UTF-8 con esta opción. El archivo de valor debe contener sólo el valor (sin marca de orden de bytes). Se permiten los caracteres de retorno de carro y de avance de línea, pero se ignoran sin advertencia. Esta opción almacena un valor binario. El valor se lee de un archivo que debe ser pasado por - valuefile. Inserta o sobrescribe un registro de datos en el almacenamiento seguro. Sólo para valores de texto: muestra sólo el valor del registro de datos en la consola, incluido el carácter de escape descrito anteriormente, pero sin ninguna información de registro de datos adicional. Este comando también funciona si el valor del registro de datos tiene más de 60 caracteres. Si utiliza esta opción para un valor cifrado, el sistema activa un error. Sólo para valores binarios: Escribe los datos binarios en un archivo cuyo nombre esté dado por esta opción. Si utiliza esta opción para un valor cifrado, el sistema activa un error. Obtiene un registro de datos desde el almacenamiento seguro. Los caracteres de escape para los valores de texto se muestran como se describe para la operación puesta. Puede utilizar el informe RSECSSFXESCAPE para convertir el valor al formato correcto para su conjunto de caracteres. La herramienta no muestra los valores de los registros de datos que se han almacenado encriptados. Si un valor de texto tiene más de 60 caracteres, también no se muestra en la salida normal para evitar un rebasamiento de la consola. En estos casos, utilice el comando - getPlainValueToConsole. Intenta descifrar los registros de datos que se colocaron en el almacenamiento seguro con una clave de cifrado que no sea la clave actual. Este comando está diseñado como una solución de emergencia si ha cambiado el archivo de claves fuera de la herramienta y por lo tanto ya no puede leer los registros de datos. El requisito previo para esto, sin embargo, es que todavía se conoce la clave de cifrado que se utilizó para insertar las entradas que ya no se pueden leer. Si utiliza la herramienta para cambiar la clave, vuelve a cifrar automáticamente los registros de datos. Fin de la nota. No puede destruir datos ejecutando este comando. Los registros de datos que la herramienta todavía no puede descifrar utilizando la clave de cifrado antigua especificada se conservan tal cual. Esto significa que puede intentar descifrar estos registros nuevamente más tarde.
No comments:
Post a Comment