如何将 * char 或 char 转换为位? 例如: 这是我的声明
uint64_t blocks[64];
char * word = "hello";
如何在 block [0]内存储单词hello(以字节为单位)? 我试过这个
int e;
int a = strlen(word);
for (e = 0; e < a; e++) {
blocks[0] |= !!word[e] >> 8;
}
另外,我将如何逆转该过程?
最佳答案
“我想将 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
设置为我们复制的最后一个字符串的末尾,假设我们要将“hello”然后“world”复制到 block
并以表示“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 中的字符串是以 null 结尾的,因此如果我们想要处理结果作为字符串,末尾需要一个 null。完成复制(从上面)后您拥有的最后一个偏移
可用于添加此内容。
char new_word[100];
memcpy(new_word, blocks, sizeof new_word);
new_word[offset] = 0;
顺便说一下,我们不必复制数据来将其视为 char *
;我们可以直接转换...
char * new_word = (char *)blocks;
...但请记住,如果您这样做,修改 new_word
也会修改 blocks
。
关于将 *char 或 char 转换为位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26476781/