gpt4 book ai didi

c - 如何在 C++ 中将缓冲区转换为二进制字符串?

转载 作者:行者123 更新时间:2023-12-04 06:21:55 27 4
gpt4 key购买 nike

我正在尝试将任意缓冲区转换为其二进制表示的字符串。我正在查看这里的一些代码:http://snippets.dzone.com/posts/show/2076为了开始。我意识到这段代码不能转换任意缓冲区,而只能转换为 int 的特定情况;然而,我认为一旦它工作,我就可以适应任何情况。

问题是它返回了一些奇怪的符号(如:�왿")而不是二进制文件。有谁知道这段代码有什么问题,或者解释如何转换任意缓冲区?

请记住,我是 C++ 的新手。

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

char *getBufferAsBinaryString(void *in)
{
int pos=0;
char result;
char bitstring[256];
memset(bitstring, 0, 256);
unsigned int *input= (unsigned int *)in;
for(int i=31;i>=0;i--)
{
if (((*input >> i) & 1)) result = '1';
else result = '0';
bitstring[pos] = result;
if ((i>0) && ((i)%4)==0)
{
pos++;
bitstring[pos] = ' ';
}
pos++;
}
return bitstring;
}
int main(int argc, char* argv[])
{
int i=53003;
char buffer[1024];
char *s=getBufferAsBinaryString(&i);
strcpy(buffer, s);
printf("%s\n", buffer);
}

最佳答案

数组位串具有所谓的自动持续时间,这意味着它在函数被调用时出现并在函数返回时消失。

所以,这个版本的指针getBufferAsBinaryString返回到调用者收到指针时不再存在的数组。 (请记住,语句 return bitstring; 通过“数组和指针的等效性”返回指向 bitstring; 中第一个字符的指针,在此上下文中提及数组 bitstring 等效于 &bitstring[0] 。)

当调用者尝试使用指针时,getBufferAsBinaryString 创建的字符串可能仍然存在,或者内存可能已被某些其他功能重新使用。因此,此版本getBufferAsBinaryString是不够的,也是 Not Acceptable 。函数绝不能返回指向本地、自动持续时间数组的指针。

由于返回指向本地数组的指针的问题是该数组默认具有自动持续时间,因此对上述getBufferAsBinaryString 的非功能版本进行了最简单的修复。是将数组声明为静态,而不是:

char *getBufferAsBinaryString(void *in)
{
int pos=0;
char result;
static char bitstring[256];
memset(bitstring, 0, 256);
unsigned int *input= (unsigned int *)in;
for(int i=31;i>=0;i--)
{
if (((*input >> i) & 1)) result = '1';
else result = '0';
bitstring[pos] = result;
if ((i>0) && ((i)%4)==0)
{
pos++;
bitstring[pos] = ' ';
}
pos++;
}
return bitstring;
}

现在, bitstring getBufferAsBinaryString时数组不消失返回,因此该指针在调用者使用它时仍然有效。

返回指向静态数组的指针是解决“返回”数组问题的一种实用且流行的解决方案,但它有一个缺点。每次调用该函数时,它都会重新使用相同的数组并返回相同的指针。因此,当您第二次调用该函数时,它上次“返回”给您的任何信息都将被覆盖。 (更准确地说,函数返回的指针所指向的信息将被覆盖。)

虽然 static返回数组技术将起作用,调用者必须小心一点,并且永远不要期望从一次调用到该函数的返回指针在稍后调用该函数后可用

但是你在传递 void * 时仍然有一个不同的问题。我没有涵盖,此外没有传递缓冲区的大小。由于您不应该假设您的数组以 \0 结尾,您还应该传入缓冲区的大小。

关于c - 如何在 C++ 中将缓冲区转换为二进制字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6446650/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com