2009-05-20 16 views
5

Perdóneme si esto se ha preguntado antes, pero le aseguro que he buscado en Internet y no he encontrado nada, probablemente porque no tengo la terminología correcta. (?)Codificación de ... algún tipo?

me gustaría tener un entero y convertirlo en un ascendente hacia la izquierda representación hexadecimal como esto:

303 -> 0x2f010000

puedo ver que los bytes se envasan de forma que la Los lugares de 16 y 1 están en el mismo byte, y el lugar de 4096 y el lugar de 256 comparten un byte. Si alguien pudiera indicarme la terminología correcta para dicha codificación, estoy seguro de que podría encontrar mi respuesta sobre cómo hacerlo. ¡Gracias!

+0

¿Está buscando una función como dec2hex? Muchos idiomas tienen facilidades para convertir una representación decimal a una representación hexadecimal. – Kekoa

+3

+1 por posiblemente la pregunta más educada que he visto en SO. :-) –

+0

Convertir directamente a hexadecimal no es un problema. Como en el ejemplo, puedo convertir 303 a 12f con una conversión hexadecimal. Lo que necesito es la codificación usando un byte para mantener cada par de "lugares" hexadecimales, si eso tiene sentido. – Blumer

Respuesta

2

operadores uso de bits de desplazamiento combinados con bitwise AND y OR operadores ...

suponiendo 32 bits sin signo:

int value = 303; 
int result = 0x00000000; 

for (int i = 0; i < 4; i++) 
{ 
    result = result | ((value & (0xFF << (i * 8))) << (24 - (i * 8))); 
} 
+0

Gracias, Demi. No creo que esto terminara siendo todo lo que necesitaba, pero probablemente más porque no describí del todo el problema. – Blumer

+0

@Blumer: el fragmento de código en vb hace esencialmente lo mismo, solo que con un orden de operaciones ligeramente diferente y con división entera en lugar de operaciones de bits. En esencia, es byte que cambia el byte 0 con el byte 3 y el byte 1 con el byte 2 – Demi

2

-big endian y little-endian se refieren al orden de los bytes en la memoria . Un valor como 0x2f100000 no tiene endianness intrínseco, endianness depende de la arquitectura de la CPU.

Si siempre desea invertir el orden de los bytes en un valor de 32 bits, use el código que Demi publicó.

Si siempre quiere obtener el orden de bytes específico (porque se está preparando para transferir esos bytes a través de la red, o almacenarlos en un archivo de disco), use algo más. P.ej. la biblioteca de sockets BSD tiene una función htonl() que toma el valor nativo de 32 bits de su CPU y lo coloca en el orden big-endian.

Si está ejecutando en una máquina little-endian, htonl (303) == 0x2f100000. Si está ejecutando en una máquina big-endian, htonl (303) == 303. En ambos casos, el resultado se representará por bytes [0x00, 0x00, 0x01, 0x2f] en la memoria.

0

Si alguien puede poner un término específico a lo que estaba tratando de hacer, todavía me encantaría escucharlo. Sin embargo, sí encontré la manera de hacer lo que necesitaba, y lo publicaré aquí, así que si alguien viene a cuidarme, pueden encontrarlo. Puede haber (probablemente es) una manera más fácil, más directa de hacerlo, pero aquí es lo que terminé haciendo en VB.Net para recuperar el código de bytes que quería:

Private Function Encode(ByVal original As Integer) as Byte()  
    Dim twofiftysixes As Integer = CInt(Math.Floor(original/256)) 
    Dim sixteens As Integer = CInt(Math.Floor((original - (256 * twofiftysixes))/16)) 
    Dim ones As Integer = original Mod 16 
    Dim bytecode As Byte() = {CByte((16 * sixteens) + ones), CByte(twofiftysixes), 0, 0} 
    Return bytecode 
End Function 

rompiendo efectivamente el entero más arriba en su componentes hex, luego convirtiendo los pares apropiados en cBytes.

Cuestiones relacionadas