2016-12-06 5 views
0

Я пытаюсь поставить шестнадцатеричные значения в Byte[], Пытаясь достичь 78,66,1E, B5,4F, E7,67,63Ввод Hex в массив байтов

#define BYTE unsigned char 
    int num = 1; 

    long long hex[] 
    { 
    0x78661EB54FE76763, 
    }; 

int main() 
{ 

     for (int c = 0; c < num; c++) 
     { 
      printf("%llx\n", hex[c]); 

      unsigned int number = hex[c]; 
      unsigned int ef = number & 0xff; 
      unsigned int cd = (number >> 8) & 0xff; 
      unsigned int ab = (number >> 16) & 0xff; 

      printf("%x", number & 0xff); 

      BYTE data2[8]{ 
       ef, cd, ab 
      }; 

     } 
} 

Обновление:

В основном у меня есть массив из 30 нечетных шестнадцатеричных значений. Я пытаюсь пропустить этот массив с именем hex [], затем для каждого шестнадцатеричного значения разделите его на 2, т.е. 78,66,1E, B5,4F, E7,67,63, затем добавьте каждый в массив типа BYTE, который будет удерживайте шестнадцатеричное значение в 8 пар, поэтому данные [0] будут иметь значение 78 до данных [8], которое будет иметь значение 63. Поэтому я могу затем передать массив типа BYTE другому методу для дальнейшей работы

+0

Это не будет компилироваться как есть. Поскольку long long hex [] 'является объявлением с инициализаторами, для утверждения требуется знак' = 'перед первым вьющимся:' {'и терминатор оператора C:'; 'после закрытия curly:'} '. А запятая после '0x78661EB54FE76763' должна быть удалена. – ryyker

+0

будет скомпилирован для вас, обновленный –

+0

, вы продолжаете говорить «в основном у меня есть массив из 30 нечетных шестнадцатеричных значений». Что вы имеете в виду, ваш образец показывает один длинный длинный с одним большим значением. Каковы ваши реальные исходные данные, покажите это в вопросе – pm100

ответ

3

Вот решение, что вы хотите:

#include <stdio.h> 
typedef unsigned char BYTE; 
int main() 
{ 
    int i,j; 
    long long hex=0x78661EB54FE76763; 
    BYTE val[8]; 

    for(j=0,i=7; i>=0; i--,j++){ 
     val[j]= (hex>>(i*8))&0xff; 
    }  

    printf("Hexadecimal bytes are:\n"); 
    for(j=0;j<8;j++){ 
     printf("%02X ",val[j]); 
    } 

    return 0; 

} 

И выход:

Hexadecimal bytes are: 
78 66 1E B5 4F E7 67 63 
+0

Я думаю, что OP хочет разбить большое количество на небольшие числа. Вы инициализируетесь небольшими числами. – ryyker

+0

В основном у меня есть массив из 30 нечетных шестнадцатеричных значений. Я пытаюсь пропустить этот массив с именем hex [], затем для каждого шестнадцатеричного значения разделите его на 2, т.е. 78,66,1E, B5,4F, E7,67,63, затем добавьте каждый в массив типа BYTE, который будет удерживайте шестнадцатеричное значение в 8 пар, поэтому данные [0] будут иметь значение 78 –

+0

Thaks @ryyker, теперь решение на 100% правильно – Mike

0

Предполагая, что BYTE является типом

BYTE data2[] = {ef, cd, ab, '\0'}; 

Используйте null терминатор, чтобы печатать с "%s" и printf().

Конечно, вы можете добавить остальные байты.

+0

Да BYTE - это тип, я обновил выше, извините, если я объясню, что это запутанный способ.Я просто не могу понять, как добавить их парами по два простых слова. –

0

Это довольно простая задача, чтобы выполнить все, что вам нужно, значения инициализации, которые вы дали ,

long long hex[] = { 0x78661EB54FE76763 };

Далее, вам нужно указатель обугленного, что указывает на шестнадцатеричный массив

unsigned char* pByte = (unsigned char*)hex; // Point to the first element in hex array

Затем создайте буфер 8 байт и очистить его с MemSet:

unsigned char byteArray[8];
memset(byteArray, 0, sizeof(byteArray));

Все, что вам нужно сделать, это разыменовать указатель на символ и поместить значение в 8 байт e буфера.

// Loop through the hex array and assign the current byte 
// the byte pointer is pointing to then increment the byte pointer 
// to look at the next value. 
// This for loop is for a system that is little endian (i.e. win32) 
for (int i = 7; i >= 0; i--) 
{ 
    byteArray[i] = *pByte; 
    pByte++; 
} 

Примечание: Поскольку я побежал это с Visual Studio 2015 все немного младшему. Вот почему первый цикл цикла написан так, как он есть.

Смотрите ниже полный листинг программы, которую я написал & испытанный ниже демонстрирует это:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    long long hex[] = { 0x78661EB54FE76763 }; // Value of an element 
    unsigned char* pByte = (unsigned char*)hex; // Assign a char pointer to point to the first element in hex array 
    unsigned char byteArray[8];     // This is the byte buffer that will be populated from the hex array 
    memset(byteArray, 0, sizeof(byteArray));  // Clear out the memory of byte array before filling in the indices 

    // Loop through the hex array and assign the current byte 
    // the byte pointer is pointing to then increment the byte pointer 
    // to look at the next value. 
    // This for loop is for a system that is little endian (i.e. win32) 
    for (int i = 7; i >= 0; i--) 
    { 
    byteArray[i] = *pByte; // Dereference the pointer and assign value to buffer 
    pByte++;    // Point to the next byte 
    } 

    // Print the byte array 
    for(int i = 0; i < 8; i++) 
    { 
    printf("The value of element %i is: %X\n", i, byteArray[i]); 
    } 

    printf("Press any key to continue..."); // Hold the console window open 
    getchar(); 
    return 0; 
} 
+0

Почему вы «очищаете его с помощью memset», когда вы просто перезаписываете весь массив в следующем цикле? –

+0

Мне нравится инициализировать все до определенного состояния, чтобы избежать неопределенного поведения. – Brandon83

+0

с использованием '= {0};' вместо memset уменьшает риск UB из-за ошибки с memset –

Смежные вопросы