#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
чисел? Можете ли вы включить хотя бы какой-нибудь фрагмент кода в вопрос о том, что, по вашему мнению, вы должны делать?