Duda en conversion de 24 bits a 32 bits

Iniciado por armizh, 22 Enero 2012, 23:53 PM

0 Miembros y 1 Visitante están viendo este tema.

armizh

Hola pues tengo aqui una pequeña duda, que a pesar de buscar en internet en miles de paginas (cortesia de google) no he podido solucionar. Es un pequeño dilema que me he ganado por el tema del endianness. Pues quiero convertir un entero de 24 bits a uno de 32 ya que estoy trabajando con el LBA para el acceso a las unidades de discos soportadas por ATA/ATAPI e IDE. Partimos de la base de que ya tengo separados en bytes el entero. Bueno, dentro de la etiqueta 'code' esta lo que he entendido buscando informacion. De antemano, gracias.
// Inicialmente tengo el numero 0xA0B0C0 el cual es de 24 bits.
// Las i386 y superiores son little endian por lo que un esquema de bytes queda asi
// Byte 3 | Byte 2 | Byte 1
// C0     | B0     | A0
// Y debo convertirlo a su equivalente de 32 bits el cual debiese ser asi
// Byte 4 | Byte 3 | Byte 2 | Byte 1
// C0     | B0     | A0     | 00
// ¿Es correcto el esquema?
// En tal caso, esta correcto el código?
word lba_conv(byte b1, byte b2, byte b3)
{
word val = 0;
val = val | b1;
val = val << 8;
val = val | b2;
val = val << 8;
val = val | b3;
}

Gracias a todos. Saludos
Visita mi blog:
http://armizh.10h.us/
Fnx, fork de FreeNOS:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Fnx
Hamster, Entorno Integrado de Desarrollo C/C++:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Hamster

BlackZeroX

#1
Hasta donde yo se un numero por decir uno el "24" en un int de 8, 16, 24, 32 y 64 SIEMPRE tendran los mismos bits encendidos.

Prueba estas funciones que te arme


typedef int INT32;  //  Entero de 4 bytes...
typedef int INT24;  //  Deberian ser 3 bytes... de manera auxiliar pongo un int de 4 bytes...

INT32 int24To32(INT24 i24)
{
    INT32 i32Ret = (0x7fffff & i24); // Esta mascara la implemente por que ahorita en este codigo INT24 es de 32 bits (la estoy emulando).
    return (i24 & 0x800000) ? (0x800000 | i24) : i24;
}

INT24 int32To24(INT32 i32)
{
    INT24 i24Ret = (0x7fffff & i32); // Esta mascara es para obtener los 3 bytes menos significativos que corresponden a un entero de 24 bits.
    //  la "e" es para ignorar el bit que se supone es para el bit de signo (el que corresponde) para el entero de 24 bits... en este caso
    //  omitimos este y lo dejamos en 0, y verificamos si el bit de signo del entero de 32 esta encendido para encenderlo en el entero de 24 bits.
    return (i32 & 0x80000000) ? (0x800000 | i32) : i32;
}


Edito:

Aclaración: las funciones son para Dezplazar el signo y poner en donde corresponde el bit de signo... en tal caso que no quieras desplazarlo solo debes aplicar mascaras:

entero24 =  0xffffff & entero32;

entero32 = entero24;

Dulces Lunas!¡.
The Dark Shadow is my passion.

armizh

Ohhh gracias pero una pregunta... los enteros que estoy usando son sin signos, las mascaras para no desplazar el signo valen no? Gracias
Visita mi blog:
http://armizh.10h.us/
Fnx, fork de FreeNOS:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Fnx
Hamster, Entorno Integrado de Desarrollo C/C++:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Hamster

BlackZeroX

#3
Si son sin signo entonces usa las mascaras e ignora las funciones...

Dulces Lunas!¡.
The Dark Shadow is my passion.

x64core

@BlackZeroX:
:huh:
el binario del EFFFFF es:
1110 1111 1111 1111 1111 1111

y como se supone que son 24 bits entonces el signo no seria el bit 24? :P

armizh

Cita de: RHL en 23 Enero 2012, 01:49 AM
@BlackZeroX:
:huh:
el binario del EFFFFF es:
1110 1111 1111 1111 1111 1111

y como se supone que son 24 bits entonces el signo no seria el bit 24? :P
Pero eso no importa mucho xd finalmente eran enteros sin signo por lo que no influye.
Cita de: BlackZeroX (Astaroth) en 23 Enero 2012, 01:35 AM
Si son signo entonces usa las mascaras e ignora las funciones...

Dulces Lunas!¡.
Gracias, me imaginaba eso. Muchisimas gracias. Saludos
Visita mi blog:
http://armizh.10h.us/
Fnx, fork de FreeNOS:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Fnx
Hamster, Entorno Integrado de Desarrollo C/C++:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Hamster

BlackZeroX

#6
Si perdon en lugar de 0xefffff es 0x7fffff en las funciones... pero no importa (en el problema del creador de este hilo) en lo que va a hacer el tiene que hacer esta mascara 0xffffff

Dulces Lunas!¡.
The Dark Shadow is my passion.