我正在尝试将任意缓冲区转换为其二进制表示的字符串。我在这里看一些代码: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);
}
答案 0 :(得分:2)
数组bitstring具有所谓的自动持续时间,这意味着它在调用函数时会弹出,并在函数返回时消失。
因此,此版本的getBufferAsBinaryString
返回的指针指向一个数组,该数组在调用者接收指针时不再存在。 (请记住,语句return bitstring;
通过“数组和指针的等价”返回指向bitstring;
中第一个字符的指针,在此上下文中提及数组bitstring
等同于{ {1}}。)
当调用者尝试使用指针时,&bitstring[0]
创建的字符串可能仍然存在,或者内存可能已被某些其他函数重用。因此,此getBufferAsBinaryString
版本不够用,也不可接受。函数必须永远不会返回指向本地自动持续时间数组的指针。
由于返回指向本地数组的指针的问题是默认情况下数组具有自动持续时间,因此对getBufferAsBinaryString
的上述非功能版本的最简单修复是将数组声明为静态,而是:< / p>
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
返回数组技术可以工作,但是调用者必须要小心一点,并且在以后调用函数之后必须永远不要指望从一次调用函数的返回指针可以使用< / p>
但是你传递static
仍然有一个不同的问题,我没有覆盖,另外没有传递缓冲区的大小。由于您不应该假设您的数组以void *
结尾,因此您也应该传递缓冲区的大小。
答案 1 :(得分:1)
忽略内存和安全性的其他问题,您没有返回有效的以空字符结尾的字符串。你也没有传递输入缓冲区的大小,所以你真的只打印出输入缓冲区的前32位的32位位表示。
所以,除了传入char
缓冲区来写入或只是返回std::string
之外,你还应该传入输入缓冲区的大小并循环它。
答案 2 :(得分:0)
您无法从函数返回本地分配的数组。一旦函数完成,数组就不再存在,因此您返回的指针不再指向有效对象。
不应使用char
数组来表示你的bitstring,你应该考虑使用std::string
,它具有合理的值语义(即,你可以复制它,从函数返回它等,没有除了从效率的角度来看,不得不担心它。)