如何读取密文的所有十六进制值?
How can I read all hex values of ciphertext?
有一个密文,没有任何扩展名,大小为 32 字节。因此,我可以用十六进制编辑器得到它的十六进制值,它的十六进制值为;
a3 0b 35 8f 14 4e fe 5e 27 5a bd 8c 53 8b a0 cb ae da d3 fc 87 8b 51 0b d6 37 3e 91 86 9f f3 c9
我试图用我的代码从密文中读取这些值,
ifstream stream;
unsigned char c;
char arr[2];
char cipherhex[65];
int i=0;
stream.open("ciphertext2");
while (!stream.eof()) {
stream >> c;
sprintf(arr, "%02x", c);
cout << arr[0] << arr[1] << " ";
cipherhex[i] = arr[0];
cipherhex[i+1] = arr[1];
i += 2;
}
然而,当我运行这段代码时,虽然有条件0x种十六进制值,它可以读取这些十六进制值;
a3 35 8f 14 4e fe 5e 27 5a bd 8c 53 8b a0 cb ae da d3 fc 87 8b 51 d6 37 3e 91 86 9f f3 c9 c9
密码无法读取 0b, 09, 0c ,但是对于不同的密文它可以阅读 03 或 0e 。我无法理解它如何读取 03 和 0e 但不能读取 09 或 0b。提前致谢。
一般情况下,读取十六进制值是没有问题的,但是读取特定的值有问题,我上面说的
你的代码有几个错误:
没有以二进制模式打开文件。
使用operator>>
读取格式化字符,忽略空白字符。
没有为 arr[]
分配足够的内存,导致 sprintf()
.
中的缓冲区溢出
using !eof()
as your loop condition.
读取完成后cipherhex
不以空值终止(可选).
试试这个:
ifstream stream;
char c, arr[3], cipherhex[65];
int cypherhexlen = 0;
stream.open("ciphertext2");
while ((cypherhexlen < 64) && stream.get(c)) {
sprintf(arr, "%02x", static_cast<unsigned char>(c));
cout << arr[0] << arr[1] << " ";
cipherhex[cypherhexlen] = arr[0];
cipherhex[cypherhexlen+1] = arr[1];
cypherhexlen += 2;
}
cipherhex[cypherhexlen] = '[=10=]';
// use cipherhex as needed...
或者,我会选择更像这样的东西:
ifstream stream;
unsigned char cipher[32];
stream.open("ciphertext2");
stream.read(reinterpret_cast<char*>(cipher), 32);
int cypherlen = stream.gcount();
for(int i = 0; i < cypherlen; ++i) {
cout << hex << noshowbase << setw(2) << cipher[i] << " ";
}
// use cipher as needed...
有一个密文,没有任何扩展名,大小为 32 字节。因此,我可以用十六进制编辑器得到它的十六进制值,它的十六进制值为;
a3 0b 35 8f 14 4e fe 5e 27 5a bd 8c 53 8b a0 cb ae da d3 fc 87 8b 51 0b d6 37 3e 91 86 9f f3 c9
我试图用我的代码从密文中读取这些值,
ifstream stream;
unsigned char c;
char arr[2];
char cipherhex[65];
int i=0;
stream.open("ciphertext2");
while (!stream.eof()) {
stream >> c;
sprintf(arr, "%02x", c);
cout << arr[0] << arr[1] << " ";
cipherhex[i] = arr[0];
cipherhex[i+1] = arr[1];
i += 2;
}
然而,当我运行这段代码时,虽然有条件0x种十六进制值,它可以读取这些十六进制值;
a3 35 8f 14 4e fe 5e 27 5a bd 8c 53 8b a0 cb ae da d3 fc 87 8b 51 d6 37 3e 91 86 9f f3 c9 c9
密码无法读取 0b, 09, 0c ,但是对于不同的密文它可以阅读 03 或 0e 。我无法理解它如何读取 03 和 0e 但不能读取 09 或 0b。提前致谢。
一般情况下,读取十六进制值是没有问题的,但是读取特定的值有问题,我上面说的
你的代码有几个错误:
没有以二进制模式打开文件。
使用
operator>>
读取格式化字符,忽略空白字符。没有为
arr[]
分配足够的内存,导致sprintf()
. 中的缓冲区溢出
using
!eof()
as your loop condition.读取完成后
cipherhex
不以空值终止(可选).
试试这个:
ifstream stream;
char c, arr[3], cipherhex[65];
int cypherhexlen = 0;
stream.open("ciphertext2");
while ((cypherhexlen < 64) && stream.get(c)) {
sprintf(arr, "%02x", static_cast<unsigned char>(c));
cout << arr[0] << arr[1] << " ";
cipherhex[cypherhexlen] = arr[0];
cipherhex[cypherhexlen+1] = arr[1];
cypherhexlen += 2;
}
cipherhex[cypherhexlen] = '[=10=]';
// use cipherhex as needed...
或者,我会选择更像这样的东西:
ifstream stream;
unsigned char cipher[32];
stream.open("ciphertext2");
stream.read(reinterpret_cast<char*>(cipher), 32);
int cypherlen = stream.gcount();
for(int i = 0; i < cypherlen; ++i) {
cout << hex << noshowbase << setw(2) << cipher[i] << " ";
}
// use cipher as needed...