Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;如何将无符号字符数组转换为字符串?_C++_String_Sha - Fatal编程技术网

C++ C++;如何将无符号字符数组转换为字符串?

C++ C++;如何将无符号字符数组转换为字符串?,c++,string,sha,C++,String,Sha,我正在测试一段对二进制文件执行哈希操作(sha256)的代码,我得到如下结果: 用于(i=0;i 谢谢#包括 #包括 #包括 std::ostringstream oss; 对于(int i=0;i代码>大小>代码>等。但是,我怀疑它通常是重要的,因此C++版本的额外安全性和可读性在这种情况下获胜。我将使用 char []/Cuff>接收格式化数据,然后从 char []中构造字符串< /代码>。@RemyLebeau:这没有什么好处,std::string是char[]的智能指针包装器,即使

我正在测试一段对二进制文件执行哈希操作(sha256)的代码,我得到如下结果:

用于(i=0;i

这会打印出如下内容:

12b64492d18aa37d609f27cb02ce5ba381068d1ef5625193df68451c650a2b8d
我问我怎样才能把下面的字符串变成C++中的字符串变量?< /p> 谢谢

#包括
#包括
#包括
std::ostringstream oss;
对于(int i=0;i#包括
#包括
#包括
std::ostringstream oss;
对于(int i=0;ioss对于打印十六进制值,可以使用
std::hex
格式;对于设置宽度和填充字符,可以使用
std::setw
std::setfill
,它们是
的一部分。 由于您没有显示
c
的数据类型,我建议使用无符号整数类型,例如
unsigned char
。我稍微调整了代码以使其自包含):


对于打印十六进制值,可以使用
std::hex
格式;对于设置宽度和填充字符,可以使用
std::setw
std::setfill
,它们是
的一部分。 由于您没有显示
c
的数据类型,我建议使用无符号整数类型,例如
unsigned char
。我稍微调整了代码以使其自包含):


以下是sprintf的
version,仅供比较:

#include <stdio.h>
#include <string>

std::string ss;
ss.resize(SHA256_DIGEST_LENGTH * 2 + 1); // includes space for terminating NUL
int used = 0;
for(int i = 0; i < SHA256_DIGEST_LENGTH; i++)
    used += sprintf(&ss[used], "%02x", c[i]);
ss.resize(used);
#包括
#包括
std::字符串ss;
ss.resize(SHA256_DIGEST_LENGTH*2+1);//包含用于终止NUL的空间
int=0;
对于(int i=0;i

请注意,由于使用了最终的精确大小,因此最初将缓冲区设置为大于所需大小并无害处,但如果缓冲区可能太小,则必须使用
snprintf
,并传递剩余的缓冲区空间(
ss.size()-used

#include <stdio.h>
#include <string>

std::string ss;
ss.resize(SHA256_DIGEST_LENGTH * 2 + 1); // includes space for terminating NUL
int used = 0;
for(int i = 0; i < SHA256_DIGEST_LENGTH; i++)
    used += sprintf(&ss[used], "%02x", c[i]);
ss.resize(used);
#包括
#包括
std::字符串ss;
ss.resize(SHA256_DIGEST_LENGTH*2+1);//包含用于终止NUL的空间
int=0;
对于(int i=0;i

请注意,由于使用了最终的精确大小,因此最初将缓冲区设置为大于所需大小并无害处,但如果缓冲区可能太小,则必须使用
snprintf
,并传递剩余的缓冲区空间(
ss.size()-used
).

如果你喜欢
printf
,就有
sprintf
。如果你喜欢iostreams,就有stringstream。如果你喜欢
printf
,就有
sprintf
。如果你喜欢iostreams,就有stringstream。这只是打印循环索引,而不是OP想要转换的源数组中的字符…@下划线\u d:right;I just想演示
std::hex
的使用,由于OP没有指定
c
的类型,我重写了该部分。但是:现在修改答案,对
c
的类型提出建议。这只是打印循环索引,而不是OP想要转换的源数组中的字符…@下划线\u d:对;我只是想要为了演示
std::hex
的使用,并且由于OP没有指定
c
的类型,我重写了该部分。但是:现在修改答案,对
c
的类型提出建议。我将使用
char[]
接收格式化数据,然后从
char[]构建
字符串
@RemyLebeau:这没有什么好处,
std::string
char[]
的智能指针包装器,即使您使用静态大小的本地数组,您仍然会遇到额外的副本。我展示的方式更好。为了更高效,请取消
sprintf
调用(它必须解析格式字符串)只需执行两个 char < /Cord>赋值,对应于高、低字节,直接进入 STD::String < /C> >我想从技术上讲,一个原始分配的数组的优点是,可以获得空间化,然后编写你想要的东西,而C++容器要求你<代码> Resiz()。
并因此在覆盖之前在新容量中设置一些已知值,或
reserve()
然后
emplace
/
push\u back()逐件,使库检查每次代码“<代码>容量>代码>大小>代码>等。但是,我怀疑它通常是重要的,因此C++版本的额外安全性和可读性在这种情况下获胜。我将使用<代码> char []/Cuff>接收格式化数据,然后从 char []中构造<代码>字符串< /代码>。
@RemyLebeau:这没有什么好处,
std::string
char[]
的智能指针包装器,即使您使用静态大小的本地数组,您仍然会遇到额外的副本。我展示的方式更好。为了更高效,请取消
sprintf
调用(它必须解析格式字符串)只需执行两个 char < /Cord>赋值,对应于高、低字节,直接进入 STD::String < /C> >我想从技术上讲,一个原始分配的数组的优点是,可以获得空间化,然后编写你想要的东西,而C++容器要求你<代码> Resiz()。
并因此在覆盖之前在新容量中设置一些已知值,或
reserve()
然后
emplace
/
push\u back()逐件,每次库检查“代码>容量”/代码>、增量>代码>大小>代码>等。但是,我怀疑这通常是重要的,因此C++版本的额外安全性和可读性在这种情况下获胜。
#define SHA256_DIGEST_LENGTH 256

#include <iostream>
#include <sstream>
#include <iomanip>

int main() {

    unsigned char c[SHA256_DIGEST_LENGTH];
    for (unsigned int i=0; i<SHA256_DIGEST_LENGTH; i++)
        c[i]=i;

    std::stringstream ss;
    for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
        ss << std::hex << std::setw(2) << std::setfill('0') << (unsigned int)c[i];
    }

    std::cout << ss.str();
}
000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff
#include <stdio.h>
#include <string>

std::string ss;
ss.resize(SHA256_DIGEST_LENGTH * 2 + 1); // includes space for terminating NUL
int used = 0;
for(int i = 0; i < SHA256_DIGEST_LENGTH; i++)
    used += sprintf(&ss[used], "%02x", c[i]);
ss.resize(used);