我正在从事C ++项目,但遇到了问题。
下面是我的代码
tempfingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_TYPE_RSA);
char temp[48];
memset(temp, 0, sizeof(temp));
for (i = 0; i < 16; i++)
{
//fingerprintstream << (unsigned char)tempfingerprint[i] << ":";
if (temp[0] == 0)
{
sprintf(temp, "%02X:", (unsigned char)tempfingerprint[i]);
}
else
{
//sprintf(temp, "%s:%02X", temp, (unsigned char)tempfingerprint[i]);
char characters[3];
memset(characters, 0, sizeof(characters));
//If less than 16, then add the colon (:) to the end otherwise don't bother as we're at the end of the fingerprint
sprintf(characters, "%02X:", (unsigned char)tempfingerprint[i]);
strcat(temp, characters);
}
}
//Remove the end colon as its not needed. 48 Will already be null terminated, so the previous will contain the last colon
temp[47] = 0;
return string(temp);
当我运行我的应用程序时,我从Visual Studio中收到以下错误
Run-Time-Check Failure #2 - Stack around the variable 'temp' was corrupted.
我通过Valgrind在Linux上运行了相同的代码,但未显示任何错误,因此我不确定Windows出现了什么问题。
最佳答案
这是一种基于Paul McKenzie所说的方法(尽管他可能会以不同的方式实现),它基于您正在尝试处理流的方法
#include <iostream>
#include <sstream>
#include <iomanip> // output format modifiers
using namespace std;
int main()
{
stringstream fingerprintstream;
// set up the stream to print uppercase hex with 0 padding if required
fingerprintstream << hex << uppercase << setfill('0');
// print out the first value without a ':'
fingerprintstream << setw(2) << 0;
for (int i = 1; i < 16; i++) // starting at 1 because first has already been handled.
{
// print out the rest prepending the ':'
fingerprintstream << ":" << setw(2) << i;
}
// print results
std::cout << fingerprintstream.str();
return 0;
}
输出:
00:01:02:03:04:05:06:07:08:09:0A:0B:0C:0D:0E:0F
刚刚意识到我认为OP与垃圾输出相冲突。当输出数字时,
<<
将使用适当的转换来获取文本,但是如果输出字符,则<<
将打印该字符。因此,fingerprintstream << (unsigned char)tempfingerprint[i];
在tempfingerprint[i]
处采用二进制值,并且由于强制转换,尝试将其呈现为字符。而不是“ 97”,您将获得(假设ASCII)“ a”。您尝试打印的大量内容都会产生胡扯的字符。示例:如果我改变
fingerprintstream << ":" << setw(2) << i;
至
fingerprintstream << ":" << setw(2) << (unsigned char)i;
输出变为
0?:0?:0?:0?:0?:0?:0?:0?:0?:0?:0 :0
:0?:0?:0
:0?:0?
注意选项卡和换行符。
我确实需要知道
tempfingerprint
的定义,但是您可以通过删除强制转换来解决垃圾输出问题。根据新信息,
tempfingerprint
是const char *
,因此tempfingerprint[i]
是char
,并将被打印为字符。我们需要一个数字,因此我们必须强制该吸盘为整数。
static_cast<unsigned int>(tempfingerprint[i]&0xFF)
&0xFF
屏蔽了除最后一个字节以外的所有内容,从而消除了无符号显示时将负数的符号扩展成巨大的正数的麻烦。