2014-10-20 2 views
-3

Как преобразовать * char или char в биты? Например: Вот, мои заявленияПреобразование * char или char в биты

uint64_t blocks[64]; 
char * word = "hello"; 

Как хранить слово привет в байтах внутри блоков [0]? Я попытался это

int e; 
int a = strlen(word); 
for (e = 0; e < a; e++) { 
    blocks[0] |= !!word[e] >> 8; 
} 

Кроме того, как я буду обратный процесс?

+2

Как насчет 'memcpy (blocks, word, strlen (word))'? – ooga

+0

Мне нужны они в битовой форме, например 00100101 – Kinghill

+1

'blocks [0] | = !! word [e] >> 8;' Как вы думаете, что это делает? Я не уверен, каков ваш ожидаемый результат. Весь цикл можно свести только к последней итерации. И как это связано с битовыми картами. @ _ @. – luk32

ответ

1

«Я хочу скопировать бит в char в uint64_t».

Попытка с помощью memcpy:

void * memcpy(void * dst, const void * src, size_t n) 

например,

memcpy(blocks, word, strlen(word)); 

Более одной строки

Что касается вашего комментария, который я истолковать быть о копировании более одной строки:

memcpy копирует n байт из src в dst, так что если мы хотим скопировать несколько строк подряд, мы должны убедиться, что звонки на memcpy есть src set t o конец последней строки, которую мы скопировали, предполагая, что мы хотим скопировать «привет», а затем «мир» в blocks, и в итоге получим байты, представляющие «helloworld».

// if you have a char** words and uint64_t blocks[64]; or similar 
uint64_t blocks[64]; 
const char *words[2] = { "hello", "world" }; 

size_t offset = 0, len; 
int num_words = sizeof words/sizeof words[0], n; 
for (n = 0; n < num_words && offset < sizeof blocks; ++n) { 
    len = strlen(words[n]); 
    memcpy(((void *)blocks) + offset, words[n], len); // note the void * cast 
    offset += len; 
} 

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


Получение строки обратно

принять blocks и получить char * со всеми байтами в нем, мы должны помнить, что строки в C являются нулем, поэтому если мы хотим лечить результат в виде строки, ему нужно иметь нуль в конце. Последним offset, который у вас есть после завершения копирования (сверху), можно было бы добавить это.

char new_word[100]; 
memcpy(new_word, blocks, sizeof new_word); 
new_word[offset] = 0; 

Мы не должны копировать данные, чтобы рассматривать это как char *, кстати; Мы могли бы просто бросить ...

char * new_word = (char *)blocks; 

... но помните, что если вы сделаете это, изменяя new_word также модифицировать blocks.

+0

Будет ли это работать, если я хочу добавить больше символов в тот же uint64_t? Поскольку я хочу полностью заполнить их, прежде чем переходить к следующему блоку [1] – Kinghill

+0

Как и после того, как вы скопировали «привет», можете ли вы скопировать еще несколько символов? Да, вы можете, но вам нужно не переписывать то, что вы уже скопировали. –

+0

Как это сделать? Переписывать memcpy автоматически, или он просто сделает это после 8byte, который был занят в моем 64-битном блоке? – Kinghill

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