Как получить значение отдельных байтов переменной?
Я знаю, что для получения количества байтов, используемых типом переменной, вы используете sizeof(int)
например. Как вы получаете значение отдельных байтов, используемых при хранении числа с этим типом переменной? (т. е. int x = 125
.)
5 ответов
вы можете получить байты, используя некоторую арифметику указателя:
int x = 12578329; // 0xBFEE19
for (size_t i = 0; i < sizeof(x); ++i) {
// Convert to unsigned char* because a char is 1 byte in size.
// That is guaranteed by the standard.
// Note that is it NOT required to be 8 bits in size.
unsigned char byte = *((unsigned char *)&x + i);
printf("Byte %d = %u\n", i, (unsigned)byte);
}
на моей машине (Intel x86-64) вывод:
Byte 0 = 25 // 0x19
Byte 1 = 238 // 0xEE
Byte 2 = 191 // 0xBF
Byte 3 = 0 // 0x00
вы должны знать количество битов (часто 8) в каждом "байте". Затем вы можете извлечь каждый байт по очереди, добавив int с соответствующей маской. Представьте, что int равен 32 битам, а затем получить 4 байта из the_int:
int a = (the_int >> 24) & 0xff; // high-order (leftmost) byte: bits 24-31
int b = (the_int >> 16) & 0xff; // next byte, counting from left: bits 16-23
int c = (the_int >> 8) & 0xff; // next byte, bits 8-15
int d = the_int & 0xff; // low-order byte: bits 0-7
и вот оно: каждый байт находится в младших 8 битах a, b, c и d.
Если вы хотите получить эту информацию, сказать:
int value = -278;
(Я выбрал это значение, потому что оно не очень интересно для 125 - наименее значимый байт равен 125, а все остальные байты равны 0!)
сначала вам нужен указатель на это значение:
int* pointer = &value;
Теперь вы можете напечатать это на указатель "char", который составляет всего один байт, и получить отдельные байты путем индексирования.
for (int i = 0; i < sizeof(value); i++) {
char thisbyte = *( ((char*) pointer) + i );
// do whatever processing you want.
}
обратите внимание, что порядок байтов для целых чисел и других типов данных зависит от вашей системы - посмотрите "big-endian "против" little-endian".
Вы можете использовать union
но имейте в виду, что порядок байтов зависит от процессора и называется Endianness http://en.wikipedia.org/wiki/Endianness
#include <stdio.h>
#include <stdint.h>
union my_int {
int val;
uint8_t bytes[sizeof(int)];
};
int main(int argc, char** argv) {
union my_int mi;
int idx;
mi.val = 128;
for (idx = 0; idx < sizeof(int); idx++)
printf("byte %d = %hhu\n", idx, mi.bytes[idx]);
return 0;
}
Это должно работать:
int x = 125;
unsigned char *bytes = (unsigned char *) (&x);
unsigned char byte0 = bytes[0];
unsigned char byte1 = bytes[1];
...
unsigned char byteN = bytes[sizeof(int) - 1];
но имейте в виду, что порядок байтов целых чисел зависит от платформы.