【问题标题】:Convert *char or char to bits将 *char 或 char 转换为位
【发布时间】:2014-10-20 23:52:40
【问题描述】:

如何将 * char 或 char 转换为 bits ? 例如: 这是我的声明

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

如何将单词 hello 存储在 blocks[0] 中的字节中? 我试过这个

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

另外,我将如何扭转这个过程?

【问题讨论】:

  • memcpy(blocks, word, strlen(word)) 呢?
  • 我需要它们的位形式,比如 00100101
  • blocks[0] |= !!word[e] &gt;&gt; 8; 你觉得这有什么作用?我不确定您的预期输出是什么。您的整个循环只能减少到最后一次迭代。这与位图有什么关系。 @_@。
  • ie 'h' -> 0x68 -> 01101000(10) , blocks[0] = 1101000;
  • 是的,然后我必须将它存储在 blocks[0] 中。

标签: c memory bitmap


【解决方案1】:

“我想将 char 中的位复制到 uint64_t 中。”

尝试使用memcpy

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

例如

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

多个字符串

关于您的评论,我将其解释为关于复制多个字符串:

memcpyn字节从src复制到dst,所以如果我们想连续复制几个字符串,我们需要确保对memcpy的调用将src设置为末尾我们复制的最后一个字符串,假设我们要将“hello”然后“world”复制到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

【讨论】:

  • 如果我想在同一个 uint64_t 中添加更多字符,这会起作用吗?因为我想在移动到下一个块之前完全填写它们[1]
  • 同理,复制“hello”后,还能复制更多的字符吗?是的,你可以,但你需要确保不要覆盖你已经复制的内容。
  • 我该怎么做? memcpy 会自动覆盖,还是会在我的 64 位块中占用所有 8 字节后才覆盖?
  • memcpy 将被覆盖,因此您需要移动 memcpy 开始写入的位置。我添加了一个示例。
  • 谢谢!我终于设法做到了。有没有办法扭转这个过程?
猜你喜欢
  • 2010-10-12
  • 2011-06-08
  • 2021-04-29
  • 2013-10-18
  • 2012-01-15
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
相关资源
最近更新 更多