Кодировка ... какая-то? - PullRequest
5 голосов
/ 20 мая 2009

Простите, если об этом спрашивали раньше, но я вас уверяю, я искал в интернете и ничего не нашел, возможно потому, что у меня нет правильной терминологии.

Я хотел бы взять целое число и преобразовать его в шестнадцатеричное (?) Шестнадцатеричное представление вроде этого:

303 -> 0x2f010000

Я вижу, что байты упакованы так, что места 16 и 1 находятся в одном и том же байте, и что места 4096 и 256 имеют общий байт. Если бы кто-то мог просто указать мне правильную терминологию для такого кодирования, я уверен, что смог бы найти свой ответ, как это сделать. Спасибо!

Ответы [ 3 ]

2 голосов
/ 20 мая 2009

Big-endian и little-endian относятся к порядку байтов в памяти. Значение типа 0x2f100000 не имеет встроенного порядка байтов, порядок байтов зависит от архитектуры процессора.

Если вы всегда хотите изменить порядок байтов в 32-битном значении, используйте код, который опубликовала Деми.

Если вы всегда хотите получить определенный порядок байтов (потому что вы готовитесь передать эти байты по сети или сохранить их в файле на диске), используйте что-то еще. Например. библиотека сокетов BSD имеет функцию htonl (), которая принимает собственное 32-битное значение вашего процессора и помещает его в порядок с прямым порядком байтов.

Если вы работаете на машине с прямым порядком байтов, htonl (303) == 0x2f100000. Если вы работаете на машине с прямым порядком байтов, htonl (303) == 303. В обоих случаях результат будет представлен байтами [0x00, 0x00, 0x01, 0x2f] в памяти.

2 голосов
/ 20 мая 2009

использовать операторы сдвига битов в сочетании с побитовыми операторами И и ИЛИ ...

при условии, что 32-битное без знака:

int value = 303;
int result = 0x00000000;

for (int i = 0; i < 4; i++)
{
    result = result | ((value & (0xFF << (i * 8))) << (24 - (i * 8)));
}
0 голосов
/ 21 мая 2009

Если кто-то может поставить конкретный термин на то, что я пытался сделать, я все равно хотел бы услышать это. Однако я нашел способ сделать то, что мне было нужно, и я опубликую его здесь, чтобы, если кто-нибудь присмотрит за мной, он мог его найти. Может быть (возможно, есть) более простой и прямой способ сделать это, но вот что я закончил в VB.Net, чтобы получить желаемый байт-код:

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

Эффективное разбиение целого числа на его шестнадцатеричные компоненты, а затем преобразование соответствующих пар в cBytes.

...