你好我有一块内存(用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”。
答案 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输出代码...你需要多少速度?