Как мне преобразовать длинный массив без знака в байт на C ?

#c

#c

Вопрос:

Как мне преобразовать длинный массив без знака в байт на C ? Я разрабатываю с использованием VS2008 C .

Редактировать:

Мне нужно оценить размер этого преобразованного числа, я хочу разделить этот длинный массив на массив размером 29 байт.
например, у нас есть длинный массив = 12345;
он должен быть преобразован в байт, а затем мне нужно разделить его длину на 29 и посмотреть, сколько в нем пакетов.

Потеря данных важна, но прямо сейчас я просто хочу получить результат.

Комментарии:

1. Пожалуйста, объясните подробнее. Нужно ли его копировать или достаточно получить доступ к исходному массиву с помощью char * ? Вам нужно изменить порядковый номер?

2. Наверняка есть причина, по которой это так long ? Вы рискуете потерять данные. Можете ли вы подробнее объяснить, чего вы пытаетесь достичь?

3. Как сказал Мэтью: что мы здесь делаем? A мы выполняем какую-то понижающую выборку? Мы сериализуемся в поток байтов для вывода в сеть / файл / и т.д.?

Ответ №1:

 long array[SOME_SIZE];
char* ptr = reinterpret_cast<char*>( array ); // or just ( char* )array; in C

// PC is little-endian platform
for ( size_t i = 0; i < SOME_SIZE*sizeof( long ); i   )
{
    printf( "%x", ptr[i] );
}
  

Вот более надежное решение для вас, без указания порядкового номера (это не распространяется на странные устройства DSP, где char может быть 32-разрядная сущность, они специальные):

 long array[SOME_SIZE];

for ( size_t i = 0; i < SOME_SIZE; i   )
{
    for ( size_t j = 0; j < sizeof( long ); j   )
    {
        // my characters are 8 bit
        printf( "%x", (( array[i] >> ( j << 3 )) amp; 0xff ));
    }
}
  

Комментарии:

1. Обратите внимание, что данные в ptr будут иметь порядковый номер только на машинах с порядковым номером: это решение приведет к выводу в формате big-endian на машинах с порядковым номером big и в формате little-endian на машинах с порядковым номером little. Поймите, что означает порядковый номер, и, если порядковый номер имеет значение, найдите более надежное решение.

2. Спасибо за ваше решение, я надеюсь, оно сработает, но не могли бы вы мне помочь, как я могу посчитать, сколько это байт? с другой стороны, например, 10 равно 1001, так что это 4 байта

3. Вы можете справиться с причудливыми размерами char , j << 3 заменив j * CHAR_BIT на 0xff , и ((1 << CHAR_BIT) - 1) на,,. Для этого вам нужно включить <climits> .

4. Спасибо, Майк, я знал, что что-то забыл.

5. @rima, я думаю, мы все еще не понимаем, что тебе нужно сделать. Это одно long число или массив из long чисел? Можете ли вы включить хотя бы какой-нибудь фрагмент кода в вопрос о том, что, по вашему мнению, вы должны делать?