如何在c ++中读取内存块作为char

时间:2009-03-17 17:59:30

标签: c++ malloc char

你好我有一块内存(用malloc()分配)包含位(位文字),我想把它读成char数组,或者更好,我想打印输出ASCII内存的8个连续位的值。

我已将内存分配为char *,但是我无法以比评估每个位更好的方式取出字符,将值添加到char并在循环中向左移动char的值,但我一直在寻找更快的解决方案。 谢谢

我现在写的是:

分配:

char * bits = (char*) malloc(1);

写给mem:

ifstream cleartext;
cleartext.open(sometext);
while(cleartext.good())
{
     c = cleartext.get();
     for(int j = 0; j < 8; j++)
     {  //set(index) and reset(index) set or reset the bit at bits[i]
        (c & 0x80) ? (set(index)):(reset(index));//(*ptr++ = '1'):(*ptr++='0');
         c = c << 1;
     }..
}..

直到现在我还没有能够恢复角色,我只能使用以下方式打印出来:

printf("%s\n" bits);

我正在尝试做的一个例子是:

input.txt包含字符串“AAAB”

我的程序必须将“AAAB”写为“01000001010000010100000101000010”到内存中 (它是AAAB位的ASCII值,位为65656566)

然后我希望它具有将内存内容重写为文件的功能。

因此,如果内存再次包含“01000001010000010100000101000010”,它将写入输出文件“AAAB”。

9 个答案:

答案 0 :(得分:1)

int numBytes = 512;
char *pChar = (char *)malloc(numBytes);
for( int i = 0; i < numBytes; i++ ){
   pChar[i] = '8';
}

由于这是C ++,您还可以使用“new”:

int numBytes = 512;
char *pChar = new char[numBytes];
for( int i = 0; i < numBytes; i++ ){
   pChar[i] = '8';
}

答案 1 :(得分:1)

如果您想访问内存块中的每个,看起来您需要std::bitset

char* pChunk = malloc( n );
// read in pChunk data

// iterate over all the bits.
for( int i = 0; i != n; ++i ){
    std::bitset<8>& bits = *reinterpret_cast< std::bitset<8>* >( pByte );
    for( int iBit = 0; iBit != 8; ++iBit ) {
        std::cout << bits[i];
    }
}

答案 2 :(得分:1)

  

我想打印输出内存的8个连续位的ASCII值。

任何位的可能值为0或1.您可能至少需要一个字节。

  

char * bits =(char *)malloc(1);

在堆上分配1个字节。一个更高效,更轻松的事情就是在堆栈上创建一个对象,即:

char bits; // a single character, has CHAR_BIT bits
  

ifstream cleartext;

     

cleartext.open(sometext);

上面没有写任何内容给mem。它尝试以输入模式打开文件。

  

它有ascii字符和常见的eof或\ n,或类似的东西,输入只是一个文本文件,所以我认为它应该只包含ASCII字符,如果我错了就纠正我。

如果您的文件只有ASCII数据,您不必担心。您需要做的就是读入文件内容并将其写出来。编译器管理数据的存储方式(即用于字符的编码方式以及如何用二进制表示它们,系统的字节序等)。读/写文件的最简单方法是:

// include these on as-needed basis
#include <algorithm>
#include <iostream>
#include <iterator>
#include <fstream>

using namespace std;
// ...

/* read from standard input and write to standard output */
copy((istream_iterator<char>(cin)), (istream_iterator<char>()),
                  (ostream_iterator<char>(cout)));
/*-------------------------------------------------------------*/

/* read from standard input and write to text file */
copy(istream_iterator<char>(cin), istream_iterator<char>(),
         ostream_iterator<char>(ofstream("output.txt"), "\n") );
/*-------------------------------------------------------------*/

/* read from text file and write to text file */
copy(istream_iterator<char>(ifstream("input.txt")), istream_iterator<char>(),
         ostream_iterator<char>(ofstream("output.txt"), "\n") );
/*-------------------------------------------------------------*/

最后一个问题是:你想用二进制表示做什么吗?如果没有,请忘掉它。否则,请再次更新您的问题。

  

例如:处理字符数组以使用分组密码对其进行加密

/* a hash calculator */
struct hash_sha1 {
 unsigned char operator()(unsigned char x) {
    // process
    return rc;
  }
};

/* store house of characters, could've been a vector as well */
basic_string<unsigned char> line;

/* read from text file and write to a string of unsigned chars */   
copy(istream_iterator<unsigned char>(ifstream("input.txt")),
                                     istream_iterator<char>(),
                                      back_inserter(line) );

/* Calculate a SHA-1 hash of the input */   
basic_string<unsigned char> hashmsg;
transform(line.begin(), line.end(), back_inserter(hashmsg), hash_sha1());

答案 3 :(得分:0)

这样的东西?

char *buffer = (char*)malloc(42);
// ... put something into the buffer ...
printf("%c\n", buffer[0]);

但是,既然你正在使用C ++,我想知道你为什么要打扰malloc等等......

答案 4 :(得分:0)

char* ptr = pAddressOfMemoryToRead;

while(ptr < pAddressOfMemoryToRead + blockLength)
{
     char tmp = *ptr;
     // temp now has the char from this spot in memory
     ptr++;
}

答案 5 :(得分:0)

这是你想要实现的目标:

char* p = (char*)malloc(10 * sizeof(char));
char* p1 = p;
memcpy(p,"abcdefghij", 10);

for(int i = 0; i < 10; ++i)
{
    char c = *p1;
    cout<<c<<" ";
    ++p1;
}
cout<<"\n";
free(p);

答案 6 :(得分:0)

您能否详细解释一下,或许包括代码?你说的话毫无意义,除非我完全误读了你的问题。你在做这样的事吗?

char * chunk = (char *)malloc(256);

如果是这样,您可以通过将chunk视为数组来访问任何角色的数据:chunk[5]为您提供第5个元素等等。当然,这些将是字符,这可能是什么你想要,但我不能完全从你的问题中说出来......例如,如果chunk[5]是65,当你像cout << chunk[5];那样打印时,你会得到一个字母'A'。< / p>

但是,您可能会问如何打印实际的数字65,在这种情况下您想要cout << int(chunk[5]);。转换为int将使其打印为整数值而不是字符。如果您澄清了您的问题,我或其他人可以帮助您。

答案 7 :(得分:0)

您是否在询问如何将任意结构的内存字节复制到char *数组中?如果是这样,这应该可以解决问题

SomeType t = GetSomeType();
char* ptr = malloc(sizeof(SomeType));
if ( !ptr ) {
  // Handle no memory.  Probably should just crash
}
memcpy(ptr,&t,sizeof(SomeType));

答案 8 :(得分:0)

我不确定我是否完全不知道你想做什么,但有几点建议:

1)使用std :: vector而不是malloc / free和new / delete。它更安全,没有太多开销。

2)处理时,尝试执行块而不是字节。即使流被缓冲,通常一次抓取一个块也会更有效。

3)输出比特有很多不同的方法,但你不想再为每个字符输出一个流。您可能想尝试以下内容:

void outputbits(char *dest, char source)
{
    dest[8] = 0;
    for(int i=0; i<8; ++i)
        dest[i] = source & (1<<(7-i)) ? '1':'0';
}

传递char [9]输出缓冲区和char输入,然后返回一个可打印的位串。体面的编译器为此生成OK输出代码...你需要多少速度?