elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  es posible concatenar un array byte?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: es posible concatenar un array byte?  (Leído 10,217 veces)
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: es posible concatenar un array byte?
« Respuesta #10 en: 9 Febrero 2014, 18:12 pm »

x64Core, es cierto lo que dices, la rotación es más rápida.

El código podría entonces quedar así, para concatenar 2 bytes en un entero de 16bits:

Código:
unsigned short word1;
 
word1 = (unsigned short) buffer[1] << 8 + buffer[0];

Para concatenar 4 bytes bajo la forma de un entero de 32 bits, sería:

Código:
unsigned long int dword1;
char buffer[4];
 
/* luego convertimos */
dword1 = (unsigned long )buffer[3] << 24 + (unsigned long )buffer[2] << 16 + (unsigned long )buffer[1] << 8 + buffer[0];

Pero yo no sabría garantizar de forma absoluta la infalibilidad de este código. Lei en un libro que las operaciones a nivel de bits son "altamente dependientes de máquina", por lo que pudieran tener un comportamiento indeseado dependiendo de la arquitectura.

Como dijo otro usuario, en algunos sistemas el byte bajo es el menos significativo, mientras en otros sistemas es el más significativo, por eso cuando hablamos de "desplazamiento de bits hacia la izquierda", ¿desplaza al byte más alto o al más bajo?

Pero suponemos que al hacer el cast explícito (unsigned sort), ---el cual es indispensable en cualquier caso---, el compilador entiende que la variable en cuestión ocupa dos bytes de memoria y debe hacer el desplazamiento de bits hacia el byte más significativo, sea que este ocupe la posición más baja o más alta de memoria, dependiendo de la máquina donde esté implementado el programa. Y similarmente con el caso de los enteros de 32 bits.

Pero es una suposición mía, no lo puedo asegurar al 100%. Por ello propuse la solución basada en multiplicación, que creí más segura.


« Última modificación: 9 Febrero 2014, 20:04 pm por yoel_alejandro » En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: es posible concatenar un array byte?
« Respuesta #11 en: 9 Febrero 2014, 22:33 pm »

x64Core, es cierto lo que dices, la rotación es más rápida.

El código podría entonces quedar así, para concatenar 2 bytes en un entero de 16bits:

Código:
unsigned short word1;
 
word1 = (unsigned short) buffer[1] << 8 + buffer[0];

Para concatenar 4 bytes bajo la forma de un entero de 32 bits, sería:

Código:
unsigned long int dword1;
char buffer[4];
 
/* luego convertimos */
dword1 = (unsigned long )buffer[3] << 24 + (unsigned long )buffer[2] << 16 + (unsigned long )buffer[1] << 8 + buffer[0];

Pero yo no sabría garantizar de forma absoluta la infalibilidad de este código. Lei en un libro que las operaciones a nivel de bits son "altamente dependientes de máquina", por lo que pudieran tener un comportamiento indeseado dependiendo de la arquitectura.

Como dijo otro usuario, en algunos sistemas el byte bajo es el menos significativo, mientras en otros sistemas es el más significativo, por eso cuando hablamos de "desplazamiento de bits hacia la izquierda", ¿desplaza al byte más alto o al más bajo?

Pero suponemos que al hacer el cast explícito (unsigned sort), ---el cual es indispensable en cualquier caso---, el compilador entiende que la variable en cuestión ocupa dos bytes de memoria y debe hacer el desplazamiento de bits hacia el byte más significativo, sea que este ocupe la posición más baja o más alta de memoria, dependiendo de la máquina donde esté implementado el programa. Y similarmente con el caso de los enteros de 32 bits.

Pero es una suposición mía, no lo puedo asegurar al 100%. Por ello propuse la solución basada en multiplicación, que creí más segura.

Estoy interesado en qué fuente es quien dice que las operaciones a nivel de bits son altamente dependiente de maquina.
Me pregunto si se refieren a la arquitectura ( Little, Endian ) espero que no...



En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: es posible concatenar un array byte?
« Respuesta #12 en: 10 Febrero 2014, 21:57 pm »

Aun esperando el enlace donde dice eso yoel_alejandro. Además no habia visto esto:
Citar
Código:
word1 = (unsigned short) buffer[1] << 8 + buffer[0];

Como dije, es mejor la manipulacion de bits, se puede sustituir la operacion de suma con el operador OR, lo cual vendria ser exactamente
la misma operacion que escribí en mi primer 'post'.
En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: es posible concatenar un array byte?
« Respuesta #13 en: 11 Febrero 2014, 02:36 am »

Estimado, Deitel&Deitel, "Cómo programar en C/C++", segunda edición. en Español, 1995.

En el tema "Estructuras, uniones, manipulaciones de bits y enumeraciones", p. 407, reza:

Citar
"(...) También los programas de las secciones 10.9 y 10.10 fueron probados en una Macintosh de Apple usando Thisk C y una PC compatible, utilizando Borland C++. Ambos sistemas utilizan enteros de 16 bits (2 bytes). Dada la naturaleza de dependencia de la máquina de las manipulaciones a nivel de bits, estos programas pudieran no funcionar en su sistema"
Como vez, lo dicen Deitel&Deitel (dos profesores con décadas de experiencia enseñando C), y no yo. Por eso digo que yo no se ...

Por otra parte, ten cuidado x64 con que la suma aritmética no siempre es igual a la suma lógica. Los resultados no son iguales en caso de que se practique una suma binaria con acarreo. Por ejemplo, la suma aritmética de b'01' y b'01' será b'10' (2 en decimal). En cambio, la misma suma lógica produce b'01'. En nuestro caso, por la teoría subyacente de sistemas numéricos sabemos que debe ser la suma aritmética.

============
Por último, respecto a lo extraño de la sentencia:

Código
  1. word1 = (unsigned short) buffer[1] << 8 + buffer[0];

la acabo de probar en mi compilador (GNU gcc acorde con C99) y me dice que está bien, sólo recomienda revisar la prioridad de los operadores. Entonces, revisando más a fondo el asunto recorde que el operador de suma posee mayor prioridad que el de desplazamiento (sorry por el olvido  :-[), por lo que lo correcto sería en todo caso:

Código
  1. word1 = ((unsigned short) buffer[1] << 8) + buffer[0];

y similarmente con las demás.
« Última modificación: 11 Febrero 2014, 02:41 am por yoel_alejandro » En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: es posible concatenar un array byte?
« Respuesta #14 en: 15 Febrero 2014, 18:58 pm »

Estimado, Deitel&Deitel, "Cómo programar en C/C++", segunda edición. en Español, 1995.

En el tema "Estructuras, uniones, manipulaciones de bits y enumeraciones", p. 407, reza:
Como vez, lo dicen Deitel&Deitel (dos profesores con décadas de experiencia enseñando C), y no yo. Por eso digo que yo no se ...

Por otra parte, ten cuidado x64 con que la suma aritmética no siempre es igual a la suma lógica. Los resultados no son iguales en caso de que se practique una suma binaria con acarreo. Por ejemplo, la suma aritmética de b'01' y b'01' será b'10' (2 en decimal). En cambio, la misma suma lógica produce b'01'. En nuestro caso, por la teoría subyacente de sistemas numéricos sabemos que debe ser la suma aritmética.

============
Por último, respecto a lo extraño de la sentencia:

Código
  1. word1 = (unsigned short) buffer[1] << 8 + buffer[0];

la acabo de probar en mi compilador (GNU gcc acorde con C99) y me dice que está bien, sólo recomienda revisar la prioridad de los operadores. Entonces, revisando más a fondo el asunto recorde que el operador de suma posee mayor prioridad que el de desplazamiento (sorry por el olvido  :-[), por lo que lo correcto sería en todo caso:

Código
  1. word1 = ((unsigned short) buffer[1] << 8) + buffer[0];

y similarmente con las demás.

Hola, perdon por la tardanza; habia olvidado el tema. alejandro, pues claro que las operaciones que se pueden hacer con los operadores
logicos no pueden reemplazar a los operadores aritmeticos, pero en este caso era simplemente movimientos de valores enteros ( No en
realidad, era de un byte ) así que lo mejor es hacerlo mediante operadores logicos, sino pues, talvez puedes decirnos algo mucho más
justificado de porqué hacerlo de otra manera ( vamos, estamos en el 2014 ).

Por cierto,  puede que nos quieras decir cómo en tu suma logica el binario 01 + 01 daria como resultado 01?
( ¿No crees que te haz empatanado un poco? )
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
->Duda Con Array Of Byte
Programación Visual Basic
NsTeam 1 2,351 Último mensaje 8 Julio 2009, 04:34 am
por LeandroA
Concatenar Array de bytes con string
Programación Visual Basic
Nanoc 7 11,115 Último mensaje 10 Febrero 2010, 21:54 pm
por BlackZeroX
Ejecución desde un byte array
Análisis y Diseño de Malware
xoftfox 3 3,233 Último mensaje 9 Febrero 2014, 21:40 pm
por Yoel Alejandro
Una mano con este codigo. (array de byte dinamico)
.NET (C#, VB.NET, ASP)
70N1 4 3,327 Último mensaje 23 Septiembre 2014, 13:37 pm
por Eleкtro
MOVIDO: Una mano con este codigo. (array de byte dinamico)
Programación C/C++
Eternal Idol 0 2,500 Último mensaje 12 Septiembre 2014, 14:11 pm
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines