为 uint8_t 数组分配内存
Allocating memory for uint8_t array
使用 C++
,我正在尝试读取如下所示的文件:
111111100100000000001101
100011100000000000000000
111111000100000000101001
001011110100000000000011
001111000100000000000110
每行代表3个字节,我想用uint8_t
的数组将整个文件存入内存。
我写了这段代码,为了简单起见,在 while 循环中我只选取了每一行的第一个字节:
uint8_t * buffer = new uint8_t[lSize];
memset(buffer, 0, lSize);
ifstream file(argv[1]);
string str;
int i=0;
while(getline(file, str)){
string byte = str.substr(0,8);
bitset<8> bitsaddress(byte);
int number = bitsaddress.to_ulong();
buffer[i]=number;
cout << buffer[i]<<endl;
i++;
}
但是 shell 上的输出是这样的:
-
�
�
'
-
e
N
k
如果我打印变量 number
而不是 buffer[i]
我有正确的行为。
我不明白为什么会这样,谁能解释一下?
可打印字符是由一个字节表示的所有值的子集。从 32 到 126 的所有内容都由您可以识别为字符的东西直观地表示,但其余值不是。其他一些值会执行您会识别的操作,例如添加换行符或发出哔哔声,但根据您的终端解释其他所有内容的方式,您将在终端上看到不同形式的乱码。
为了调试,请尝试将所有结果打印为整数或十六进制字符串。
给你:
ifstream myFile("myFile");
assert(myFile.is_open()); // #include <cassert>
string str;
vector<uint8_t> vec;
int count = 0;
while (getline(myFile, str)) {
uint8_t tmp = 0;
for (const auto& c : str) {
count++;
tmp <<= 0x1;
tmp |= (c - '0');
if (count >= 8) {
vec.push_back(tmp);
tmp = 0;
count = 0;
}
}
}
myFile.close();
for (const auto& v : vec) cout << (uint32_t)v << endl;
使用 C++
,我正在尝试读取如下所示的文件:
111111100100000000001101
100011100000000000000000
111111000100000000101001
001011110100000000000011
001111000100000000000110
每行代表3个字节,我想用uint8_t
的数组将整个文件存入内存。
我写了这段代码,为了简单起见,在 while 循环中我只选取了每一行的第一个字节:
uint8_t * buffer = new uint8_t[lSize];
memset(buffer, 0, lSize);
ifstream file(argv[1]);
string str;
int i=0;
while(getline(file, str)){
string byte = str.substr(0,8);
bitset<8> bitsaddress(byte);
int number = bitsaddress.to_ulong();
buffer[i]=number;
cout << buffer[i]<<endl;
i++;
}
但是 shell 上的输出是这样的:
-
�
�
'
-
e
N
k
如果我打印变量 number
而不是 buffer[i]
我有正确的行为。
我不明白为什么会这样,谁能解释一下?
可打印字符是由一个字节表示的所有值的子集。从 32 到 126 的所有内容都由您可以识别为字符的东西直观地表示,但其余值不是。其他一些值会执行您会识别的操作,例如添加换行符或发出哔哔声,但根据您的终端解释其他所有内容的方式,您将在终端上看到不同形式的乱码。
为了调试,请尝试将所有结果打印为整数或十六进制字符串。
给你:
ifstream myFile("myFile");
assert(myFile.is_open()); // #include <cassert>
string str;
vector<uint8_t> vec;
int count = 0;
while (getline(myFile, str)) {
uint8_t tmp = 0;
for (const auto& c : str) {
count++;
tmp <<= 0x1;
tmp |= (c - '0');
if (count >= 8) {
vec.push_back(tmp);
tmp = 0;
count = 0;
}
}
}
myFile.close();
for (const auto& v : vec) cout << (uint32_t)v << endl;