Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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_Debugging_Winapi_Cng - Fatal编程技术网

C++ 将十六进制转换为可打印字符串/字符

C++ 将十六进制转换为可打印字符串/字符,c++,c,debugging,winapi,cng,C++,C,Debugging,Winapi,Cng,我正在使用生成哈希。 调用的结果是十六进制形式输入的MD5。 例如: 我想将其转换为可打印字符串:02347501 我如何才能做到这一点?如果您需要一个简单的一次性解决方案,这是一个有用的工具: 但是,如果您希望在代码本身中实现这一点,我从早期的线程中发现了这一点(也就是说,这不是我的工作,而是@from的工作) 您可以这样打印: for(const char *wsk=outHash; *wsk; ++wsk){ printf("%02hhx", *wsk); } 根据cstrin

我正在使用生成哈希。 调用的结果是十六进制形式输入的MD5。 例如:

我想将其转换为可打印字符串:02347501


我如何才能做到这一点?

如果您需要一个简单的一次性解决方案,这是一个有用的工具:

但是,如果您希望在代码本身中实现这一点,我从早期的线程中发现了这一点(也就是说,这不是我的工作,而是@from的工作)


您可以这样打印:

for(const char *wsk=outHash; *wsk; ++wsk){
    printf("%02hhx", *wsk);
}
根据cstring可以有0x00数字进行编辑。
C

const char outHash[]=“\x02\x34\x75”;
常量int size=sizeof(outHash)/sizeof(char)-1;
对于(int i=0;i
C++

std::string outHash=“\x02\x34\x75”;
for(int i=0;i
我们可以在这里使用
CRYPT_STRING_HEXASCII
CRYPT_STRING_hexax
CRYPT_STRING_hexagraw
CRYPT_STRING_hexaw | CRYPT_STRING_NOCRLF
取决于您想要的字符串格式。比如说

void print(PUCHAR pbHash, ULONG cbHash, DWORD dwFlags = CRYPT_STRING_HEXRAW | CRYPT_STRING_NOCRLF)
{
    ULONG cch = 0;
    if (CryptBinaryToStringW(pbHash, cbHash, dwFlags, 0, &cch))
    {
        if (PWSTR sz = (PWSTR)_malloca(cch * sizeof(WCHAR)))
        {
            if (CryptBinaryToStringW(pbHash, cbHash, dwFlags, sz, &cch))
            {
                DbgPrint("%S\n", sz);
            }
            _freea(sz);
        }
    }
}

要以十六进制编码字节数组并将编码数据写入
std::string
,请执行以下操作:

static inline char
hex_digit(unsigned int n)
{
    if (n < 10) return '0' + n;
    if (n < 16) return 'a' + (n - 10);
    abort();
}

std::string
encode_bytes(const unsigned char *bytes, size_t len)
{
    std::string rv;
    rv.reserve(len * 2);
    for (size_t i = 0; i < len; i++) {
        rv.push_back(hex_digit((bytes[i] & 0xF0) >> 4));
        rv.push_back(hex_digit((bytes[i] & 0x0F) >> 0));
    }
    return rv;
}
静态内联字符
十六进制数字(无符号整数n)
{
如果(n<10)返回'0'+n;
如果(n<16)返回'a'+(n-10);
中止();
}
字符串
编码字节(常量无符号字符*字节,大小长度)
{
标准:字符串rv;
房车储备(长度*2);
对于(大小i=0;i>4));
rv.向后推(十六进制数字((字节[i]&0x0F)>>0));
}
返回rv;
}

请注意,您必须知道字节数组的长度。将其视为以NUL结尾的“C字符串”是不安全的,因为二进制数据可能包含内部零字节。要知道CNG生成的哈希的长度,请调用以获取
BCRYPT\u hash\u length
属性。

在字符上循环并打印数值(十六进制)

#包括
#包括
int main()
{
char*outHash=“\x02\x34\x75\x01\x23\xff”//从哈希函数中获取。
int sizeOfHash=6;//为BCryptFinishHash()使用适当的大小
//设置流的特征。
//setw(2):每个打印对象的最小宽度为2
//setfill('0'):如果对象少于2个字符,则用“0”填充空间
//十六进制:以十六进制打印数字。

STD::CUT< P>我在我的项目中使用的Windows Cuto API和CNG上使用C++包装器。我计划把它全部移到GITHUB,但现在它只是一个正在进行中的工作,但是您可以发现它对于像HEX/BASE64编码/解码等加密基础软件

有用。

您可以使用Crypto::Hex::Encode()方法来实现所需的功能

#include <Crypto\Hex.hpp>
#include <Crypto\Random.hpp>

using namespace m4x1m1l14n;

char arr[] = { 0xaa, 0xbb, 0xcc, 0xdd, 0x99, 0x00 };

encoded = Crypto::Hex::Encode(arr, sizeof(arr));

/* encoded = "aabbccdd9900" */
#包括
#包括
使用名称空间m4x1m1l14n;
char arr[]={0xaa,0xbb,0xcc,0xdd,0x99,0x00};
encoded=Crypto::Hex::Encode(arr,sizeof(arr));
/*encoded=“aabbccdd9900”*/
您还可以使用位于散列命名空间中的MD5包装器,如下所示。(如果您没有使用大量数据)

#包括
#包括
使用名称空间m4x1m1l14n;
encoded=Crypto::Hex::Encode(Crypto::Hash::MD5(“任何您想要散列的内容”);

>代码> SpRtff>代码>将使用.<代码> %02x< /代码> .c或C++,它们是不同的语言。如果使用复制的材料,请使用它链接到复制的地方并引用代码。这里,您的朋友BTW <代码> HH> /代码>实际上不需要,如在所有签名(未签名)的变量函数中所需要的那样。小于
int
的整数类型将被提升为
int
无符号int
),您可以直接使用
%02x
,写得更少,并与旧的编译器保持兼容。@Eric Postdischil hhx表示未签名字符,如果我们想将其显示为十六进制数。请注意此站点标志,下面有长度说明符。这有一个相当严重的错误:加密哈希的二进制形式不是以NUL结尾的字符串,可能包含内部0x00字节。然后是y你只需要改变*WSK作为字符串的检查大小,但是如果是C++,我会使用STD::string作为容器。如果C和string有0x00字符,我就必须用siZof(OthHASH)/siZeof(char)来获取字符数。@ MatteoItalia代码> HH> /Cord>在<代码> Oththas[]时是有用的。
have有负值。否则可以得到像
FFFFFF80
那样的输出,而不是
80
std::string outHash = "\x02\x34\x75";
for(int i = 0; i < outHash.size(); ++i) {
    printf("%02hhx", outHash [i]);
}
void print(PUCHAR pbHash, ULONG cbHash, DWORD dwFlags = CRYPT_STRING_HEXRAW | CRYPT_STRING_NOCRLF)
{
    ULONG cch = 0;
    if (CryptBinaryToStringW(pbHash, cbHash, dwFlags, 0, &cch))
    {
        if (PWSTR sz = (PWSTR)_malloca(cch * sizeof(WCHAR)))
        {
            if (CryptBinaryToStringW(pbHash, cbHash, dwFlags, sz, &cch))
            {
                DbgPrint("%S\n", sz);
            }
            _freea(sz);
        }
    }
}
static inline char
hex_digit(unsigned int n)
{
    if (n < 10) return '0' + n;
    if (n < 16) return 'a' + (n - 10);
    abort();
}

std::string
encode_bytes(const unsigned char *bytes, size_t len)
{
    std::string rv;
    rv.reserve(len * 2);
    for (size_t i = 0; i < len; i++) {
        rv.push_back(hex_digit((bytes[i] & 0xF0) >> 4));
        rv.push_back(hex_digit((bytes[i] & 0x0F) >> 0));
    }
    return rv;
}
#include <iostream>
#include <iomanip>

int main()
{
    char*  outHash = "\x02\x34\x75\x01\x23\xff";  // Get from your Hash function.
    int    sizeOfHash = 6;                        // Use appropriate size for BCryptFinishHash()


    // Set up the characteristics of the stream.
    // setw(2):       Each printed object will use a min width of 2
    // setfill('0'):  If the object is less than 2 char then fill the space with '0'
    // hex:           Print numbers in hex.
    std::cout << std::setw(2) << std::setfill('0') << std::hex;

    // Create a view of the object.
    // Makes it simpler to loop over.
    std::string_view view(outHash, sizeOfHash);

    // Loop over the string.
    for(unsigned char val: view) {
        // Convert to `unsigned char` to make sure you don't print
        // negative numbers. Then convert from there to `int` so that
        // the `std::hex will kick in and convert to hex value.
        std::cout << static_cast<int>(val);
    }   
    std::cout << "\n";
}
#include <Crypto\Hex.hpp>
#include <Crypto\Random.hpp>

using namespace m4x1m1l14n;

char arr[] = { 0xaa, 0xbb, 0xcc, 0xdd, 0x99, 0x00 };

encoded = Crypto::Hex::Encode(arr, sizeof(arr));

/* encoded = "aabbccdd9900" */
#include <Crypto\Hex.hpp>
#include <Crypto\Hash.hpp>

using namespace m4x1m1l14n;

encoded = Crypto::Hex::Encode(Crypto::Hash::MD5("Whatever you want to hash"));