将 *char 或 char 转换为位

标签 c memory bitmap

如何将 * 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));
<小时/>

多个字符串

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

memcpyn 个字节从 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/

相关文章:

c# - 在C#中分配一 block 内存?

android - Android中可用于内存测试的软件测试技术有哪些?

security - 远程开发中的 VSCode 远程 ssh 扩展是否存储任何信息客户端?

java - 将 4 位灰度字节数组转换为位图 Android

c++ - 一个union需要多少内存

c++ - const 指针有什么意义?

c - 如何在c中删除链表中的节点

android - 如何从 Api 级别 30 中的 imageUri 获取位图?

c++ - 如何迭代位图像素

c - 整数指针未初始化