C/C++: MD5编码

MD5步骤详解及c++实现 MD5步骤详解及c++实现 文章目录MD5步骤详解及c++实现1.步骤详解操作第一步:将字符串转换为ASCII码的二进制串第二步:消息填充第三步:计算消息摘要大坑:大小端的转换问题(如果不想自己实现MD5,可以跳过)2.c++实现 1.步骤详解 操作 一个字就是32位的二进制字符串,介于000与232−12^32-1232−1之间的整数可以表示为一个字。 X和Y分别为一个字 X AND Y = X和Y按位与 X OR Y = X和Y按位或 X XOR Y = X和Y按位异或 NOT X 阅读详情

在程序编写过程中,很多时候会用到数据校验,MD5则是一个很方便的校验方式,下面就是MD5的实现方法。

1、头文件MD5.h

#ifndef MD5_H  
#define MD5_H  
#include <string>

typedef struct
{
    unsigned int count[2];
    unsigned int state[4];
    unsigned char buffer[64];
}MD5_CTX;

#define F(x,y,z) ((x & y) | (~x & z))  
#define G(x,y,z) ((x & z) | (y & ~z))  
#define H(x,y,z) (x^y^z)  
#define I(x,y,z) (y ^ (x | ~z))  
#define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))

#define TYPE_16     1
#define TYPE_32     2

#define FF(a,b,c,d,x,s,ac) { \
a += F(b, c, d) + x + ac; \
a = ROTATE_LEFT(a, s); \
a += b; \
}
#define GG(a,b,c,d,x,s,ac) { \
a += G(b, c, d) + x + ac; \
a = ROTATE_LEFT(a, s); \
a += b; \
}
#define HH(a,b,c,d,x,s,ac) { \
a += H(b, c, d) + x + ac; \
a = ROTATE_LEFT(a, s); \
a += b; \
}
#define II(a,b,c,d,x,s,ac) { \
a += I(b, c, d) + x + ac; \
a = ROTATE_LEFT(a, s); \
a += b; \
}

class MD5 {
public:
    MD5() {
        ctx = new MD5_CTX();
    };
    ~MD5() {
        delete ctx;
    };
    void MD5Init(MD5_CTX *context);
    void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen);
    void MD5Final(MD5_CTX *context, unsigned char digest[16]);
    void MD5Transform(unsigned int state[4], unsigned char block[64]);
    void MD5Encode(unsigned char *output, unsigned int *input, unsigned int len);
    void MD5Decode(unsigned int *output, unsigned char *input, unsigned int len);

    std::string Md5Encrypt(std::string input);
    std::string Md5Encrypt(std::string input, int type);

    MD5_CTX *ctx;
};
#endif

2、实现MD5.cpp

#include <string.h>
#include "DXT_MD5_16_32.h"  

unsigned char PADDING[] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

void MD5::MD5Init(MD5_CTX *context) {
    context->count[0] = 0;
    context->count[1] = 0;
    context->state[0] = 0x67452301;
    context->state[1] = 0xEFCDAB89;
    context->state[2] = 0x98BADCFE;
    context->state[3] = 0x10325476;
}

void MD5::MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen)
{
    unsigned int i = 0, index = 0, partlen = 0;
    index = (context->count[0] >> 3) & 0x3F;
    partlen = 64 - index;
    context->count[0] += inputlen << 3;
    if (context->count[0] < (inputlen << 3))
        context->count[1]++;
    context->count[1] += inputlen >> 29;

    if (inputlen >= partlen)
    {
        memcpy(&context->buffer[index], input, partlen);
        MD5Transform(context->state, context->buffer);
        for (i = partlen; i + 64 <= inputlen; i += 64)
            MD5Transform(context->state, &input[i]);
        index = 0;
    }
    else
    {
        i = 0;
    }
    memcpy(&context->buffer[index], &input[i], inputlen - i);
}

void MD5::MD5Final(MD5_CTX *context, unsigned char digest[16])
{
    unsigned int index = 0, padlen = 0;
    unsigned char bits[8];
    index = (context->count[0] >> 3) & 0x3F;
    padlen = (index < 56) ? (56 - index) : (120 - index);
    MD5Encode(bits, context->count, 8);
    MD5Update(context, PADDING, padlen);
    MD5Update(context, bits, 8);
    MD5Encode(digest, context->state, 16);
}

void MD5::MD5Encode(unsigned char *output, unsigned int *input, unsigned int len)
{
    unsigned int i = 0, j = 0;
    while (j < len)
    {
        output[j] = input[i] & 0xFF;
        output[j + 1] = (input[i] >> 8) & 0xFF;
        output[j + 2] = (input[i] >> 16) & 0xFF;
        output[j + 3] = (input[i] >> 24) & 0xFF;
        i++;
        j += 4;
    }
}

void MD5::MD5Decode(unsigned int *output, unsigned char *input, unsigned int len)
{
    unsigned int i = 0, j = 0;
    while (j < len)
    {
        output[i] = (input[j]) |
            (input[j + 1] << 8) |
            (input[j + 2] << 16) |
            (input[j + 3] << 24);
        i++;
        j += 4;
    }
}

void MD5::MD5Transform(unsigned int state[4], unsigned char block[64])
{
    unsigned int a = state[0];
    unsigned int b = state[1];
    unsigned int c = state[2];
    unsigned int d = state[3];
    unsigned int x[64];
    MD5Decode(x, block, 64);
    FF(a, b, c, d, x[0], 7, 0xd76aa478);
    FF(d, a, b, c, x[1], 12, 0xe8c7b756);
    FF(c, d, a, b, x[2], 17, 0x242070db);
    FF(b, c, d, a, x[3], 22, 0xc1bdceee);
    FF(a, b, c, d, x[4], 7, 0xf57c0faf);
    FF(d, a, b, c, x[5], 12, 0x4787c62a);
    FF(c, d, a, b, x[6], 17, 0xa8304613);
    FF(b, c, d, a, x[7], 22, 0xfd469501);
    FF(a, b, c, d, x[8], 7, 0x698098d8);
    FF(d, a, b, c, x[9], 12, 0x8b44f7af);
    FF(c, d, a, b, x[10], 17, 0xffff5bb1);
    FF(b, c, d, a, x[11], 22, 0x895cd7be);
    FF(a, b, c, d, x[12], 7, 0x6b901122);
    FF(d, a, b, c, x[13], 12, 0xfd987193);
    FF(c, d, a, b, x[14], 17, 0xa679438e);
    FF(b, c, d, a, x[15], 22, 0x49b40821);


    GG(a, b, c, d, x[1], 5, 0xf61e2562);
    GG(d, a, b, c, x[6], 9, 0xc040b340);
    GG(c, d, a, b, x[11], 14, 0x265e5a51);
    GG(b, c, d, a, x[0], 20, 0xe9b6c7aa);
    GG(a, b, c, d, x[5], 5, 0xd62f105d);
    GG(d, a, b, c, x[10], 9, 0x2441453);
    GG(c, d, a, b, x[15], 14, 0xd8a1e681);
    GG(b, c, d, a, x[4], 20, 0xe7d3fbc8);
    GG(a, b, c, d, x[9], 5, 0x21e1cde6);
    GG(d, a, b, c, x[14], 9, 0xc33707d6);
    GG(c, d, a, b, x[3], 14, 0xf4d50d87);
    GG(b, c, d, a, x[8], 20, 0x455a14ed);
    GG(a, b, c, d, x[13], 5, 0xa9e3e905);
    GG(d, a, b, c, x[2], 9, 0xfcefa3f8);
    GG(c, d, a, b, x[7], 14, 0x676f02d9);
    GG(b, c, d, a, x[12], 20, 0x8d2a4c8a);


    HH(a, b, c, d, x[5], 4, 0xfffa3942);
    HH(d, a, b, c, x[8], 11, 0x8771f681);
    HH(c, d, a, b, x[11], 16, 0x6d9d6122);
    HH(b, c, d, a, x[14], 23, 0xfde5380c);
    HH(a, b, c, d, x[1], 4, 0xa4beea44);
    HH(d, a, b, c, x[4], 11, 0x4bdecfa9);
    HH(c, d, a, b, x[7], 16, 0xf6bb4b60);
    HH(b, c, d, a, x[10], 23, 0xbebfbc70);
    HH(a, b, c, d, x[13], 4, 0x289b7ec6);
    HH(d, a, b, c, x[0], 11, 0xeaa127fa);
    HH(c, d, a, b, x[3], 16, 0xd4ef3085);
    HH(b, c, d, a, x[6], 23, 0x4881d05);
    HH(a, b, c, d, x[9], 4, 0xd9d4d039);
    HH(d, a, b, c, x[12], 11, 0xe6db99e5);
    HH(c, d, a, b, x[15], 16, 0x1fa27cf8);
    HH(b, c, d, a, x[2], 23, 0xc4ac5665);


    II(a, b, c, d, x[0], 6, 0xf4292244);
    II(d, a, b, c, x[7], 10, 0x432aff97);
    II(c, d, a, b, x[14], 15, 0xab9423a7);
    II(b, c, d, a, x[5], 21, 0xfc93a039);
    II(a, b, c, d, x[12], 6, 0x655b59c3);
    II(d, a, b, c, x[3], 10, 0x8f0ccc92);
    II(c, d, a, b, x[10], 15, 0xffeff47d);
    II(b, c, d, a, x[1], 21, 0x85845dd1);
    II(a, b, c, d, x[8], 6, 0x6fa87e4f);
    II(d, a, b, c, x[15], 10, 0xfe2ce6e0);
    II(c, d, a, b, x[6], 15, 0xa3014314);
    II(b, c, d, a, x[13], 21, 0x4e0811a1);
    II(a, b, c, d, x[4], 6, 0xf7537e82);
    II(d, a, b, c, x[11], 10, 0xbd3af235);
    II(c, d, a, b, x[2], 15, 0x2ad7d2bb);
    II(b, c, d, a, x[9], 21, 0xeb86d391);
    state[0] += a;
    state[1] += b;
    state[2] += c;
    state[3] += d;
}

std::string MD5::Md5Encrypt(std::string input) {
    MD5Init(ctx);
    int length = input.length();
    //编码
    unsigned char encrypt[16];
    MD5Update(ctx, (unsigned char*)input.c_str(), length);
    MD5Final(ctx, encrypt);

    std::string ss_16 = "";

    for (int i = 4; i < 12; i++)
    {
        char tmp[16];
        sprintf(tmp, "%02x", encrypt[i]);
        ss_16.append(tmp);
    }

    return ss_16;
}

std::string MD5::Md5Encrypt(std::string input, int type) {
    MD5Init(ctx);
    int length = input.length();
    //编码
    unsigned char encrypt[16];
    MD5Update(ctx, (unsigned char*)input.c_str(), length);
    MD5Final(ctx, encrypt);

    std::string str = "";
    if (type == TYPE_16) {
        for (int i = 4; i < 12; i++)
        {
            char tmp[16];
            sprintf(tmp, "%02x", encrypt[i]);
            str.append(tmp);
        }
        return str;
    }
    if (type == TYPE_32) {
        for (int i = 0; i < 16; i++)
        {
            char tmp[32];
            sprintf(tmp, "%02x", encrypt[i]);
            str.append(tmp);
        }
        return str;
    }

    return nullptr;
}

3、使用方法

    //传入Data数据,选择是16位还是32位
    MD5 *md5 = new MD5();
    log("md5 = %s", md5->Md5Encrypt(Data, TYPE_32).c_str());
    log("md5 = %s", md5->Md5Encrypt(Data, TYPE_16).c_str());

4、下载地址

MD5编码

MD5算法的实现原理与C/C++实现 MD5(Message Digest Algorithm 5)是一种广泛使用的加密哈希函数,由罗纳德·李维斯特(Ronald Rivest)于1991年设计。MD5的目的是从任意长度的数据中产生一个128位(16字节)的哈希值,通常表示为32个十六进制字符。MD5的设计使其用于确保数据的完整性,常见于文件校验、数字签名等场景。:首先对消息进行填充,以使其长度(以位计)模512为448。填充始终以1开始,后跟0,直到满足长度要求。:在填充的消息后追加一个64位的长度字段,表示原始消息的长度(以位计)。 阅读详情

相关推荐

VScode配置C/C++开发环境,安装/环境配置/编译/调试/汉化/编码问题

本篇是学习B站 鹏哥学C语言 自己照视频写的学习笔记,请支持鹏哥https://www.bilibili.com/video/BV1UK411C7xi?p=1&vd_source=3a37b8d942720a3c1bea00242c7f2759 一键三连

D-boy 9495

MD5算法加密C++版

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法)

m0_46632317的博客 7496

C++实战md5、base64算法实现(附源码)

本文是C/C++常用功能代码封装专栏的导航贴。部分来源于实战项目中的部分功能提炼,希望能够达到你在自己的项目中拿来就用的效果,这样更好的服务于工作实践。专栏介绍:专栏讲本人近10年后端开发常用的案例,以高质量的代码提取出来,并对其进行了介绍。代码拿去可以直接使用的,可以解决C++常见的问题。专栏使用人群:C++软件开发人员以上代码都是摘自git源码中的部分提取,安全可靠,欢迎大家使用指正。

weixin_44834554的博客 598

MD5介绍与MD5加密的C++实现

MD5相信绝大数人都接触过,也有无数人问过我怎么做MD5解密。 当然,我们知道MD5自然没有办法解密,所以解密也不过是大量已知数据做成字典而已,MD5是不可能通过逆向计算解密的。 为什么呢?因为哈希冲突。 举个简单的例子: 比如说我给定10个位置来存放东西,假设我的对应方法是简单的求余%。 那么11%10,21%10的结果就会相同。这样就造成了冲突。 MD5也是如此,我们常用的MD5位...

mijichui2153的博客 1万+

C++实现MD5哈希算法教程

MD5(Message-Digest Algorithm 5)是广泛使用的一种哈希函数,它能够产生出一个128位(16字节)的哈希值(通常为32位十六进制数字),用于确保信息传输完整一致。MD5在1991年由罗纳德·李维斯特(Ronald Rivest)设计,后成为RFC 1321标准。尽管MD5现在被认为在安全性方面存在缺陷,但它仍然被广泛用于文件完整性校验。MD5算法,即消息摘要算法第五版,是一种广泛使用的加密哈希函数,它能产生出一个128位(16字节)的哈希值(通常用32位十六进制数表示)。

weixin_42588672的博客 958

MD5编码函数实现与应用详解

MD5(Message-Digest Algorithm 5)作为1990年代广泛使用的哈希函数,其最终输出是一个128位的摘要值,通常以32位十六进制字符串形式呈现。该算法在完成消息填充、分块处理及四轮非线性变换后,必须将内部状态变量转化为外部可读的摘要格式,并通过标准化的编程接口暴露给开发者使用。本章节深入剖析从内部寄存器到最终摘要的转换机制,重点解析状态累积、字节序排列、十六进制编码等关键环节,并结合C++语言环境,详细说明如何设计和实现一个结构清晰、易于调用的md5.h头文件接口体系。

weixin_35706067的博客 1149

安居客nsign参数逆向:从Java层到SO层的加密逻辑解析

本文详细解析了安居客APP中关键网络请求参数`nsign`的逆向过程。从Java层定位到SO层核心加密逻辑,揭示了其基于固定盐值、请求路径、参数Map和UUID等多元素拼接,并经过自定义MD5变换的签名生成机制。文章通过实战案例,为学习app逆向和参数分析提供了清晰的技术路径与避坑指南。

weixin_29323365的博客 1149

C++ MD5哈希算法实现详解

本文还有配套的精品资源,点击获取 简介:MD5是一种广泛使用的哈希函数,用于将任意长度的数据转换为固定长度的128位摘要。本文提供了在C++中实现MD5算法的详细步骤,包括数据预处理、初始化状态、执行迭代过程和组合结果。同时,介绍了如何使用openssl库简化实现过程,以及在DEV环境下编译和运行MD5代码时应注意的内存管理、错误处理、编码兼容性和代码组织问题。MD5的实现...

weixin_30765637的博客 1247

MD5加密算法(C++版)

模块分解 ①填充字符串函数:在长度为K bits的原始消息尾部填充长度为P bits的标识(1000…00),其中1 &amp;lt;= P &amp;lt;= 512(即至少需要填充一个bit),使得填充后的消息位数为 K+P ≡ 448(mod 512)。注意,当K ≡ 448(mod 512)时,填充的字节数 P = 512 bit。填充得到上述消息后,在尾部附加K值的低64位,最后得到一个长度为 K+P+...

ZTao-z的博客 1万+

C++实现MD5算法

MD5(Message-Digest Algorithm 5)是一种广泛使用的密码散列函数,能够产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。它是由罗纳德·李维斯特(Ronald Rivest)于1991年设计的,最初被广泛用于验证数据完整性。然而,随着计算能力的提升和攻击方法的发展,MD5的安全性逐渐受到质疑。尽管如此,MD5在许多应用场景中仍具有其历史价值和便捷性。

weixin_28787801的博客 1127

MD5.cpp和MD5.h

c++中用来处理MD5值加密的文件,使用其中的函数能很方便对字符串加密!

Hash函数MD5-【C/C++操作openssl/md5】

白嫖是一种罪,如果有帮助建议点个赞或者关注一下。 一.MD5 即:Message-Digest Algorithm 5 (信息-摘要算法5),用于确保信息传输完整一致,是计算机广泛使用的Hash算法,将数据运算为另一个固定长度的值,是hash算法的基本原理,MD5的前身有 MD2 ,MD3, MD4。 MD5算法特点: 1. 压缩性:任意长度的数据,算出的 MD5值长度都是固定的,16个字节。 2.容易计算:从原数据计算出MD5 非常容易。 3.抗修改性:对原数据进行任意的改动,哪怕只.

qq_44065088的博客 592

C++ 实现 MD5加密 非常好用

C++实现的MD5加密,非常好用,传上来大家分享。我qq 23166010

MD5加密及HMAC-MD5加密(VC源代码

开发语言:C/C++实现功能:MD5加密及HMAC-MD5加密下载地址:HMAC-MD5.zip更新历史:V1.1 2010年05月08日增加输出BASE64编码字符串接口。V1.0 2010年04月15日完成正式版本。接口函数:MD5_HashHMAC_MD5_HashMD5_

求索 2807

自考计算机系统原理(第六章计算机系统概论)-13015

名词解释 I/O 硬件 I/O软件 用户空间I/O软件 内核空间I/O 软件 系统调用处理程序 系统调用服务例程 设备驱动程序 中断服务程序 系统级1/O函数 虚拟文件系统 文件描述符 文件元数据 流缓冲区 索引节点 目录文件 目录项 系统打开文件表 磁盘高速缓存 高速缓存 RAM I / O 控制方式 程序直接控制I/O 就绪状态 中断控制I/O 中断屏蔽字 多重中断 中断嵌套 DMA 方式 DMA 控制器 设备控制器 I/O端口 控制端口 数据端口 状态端口 I/O 地址空间 独立编址方式 统一编址方

qq_23872947的博客 1149

常用的集成TTL门电路

本篇主要分析了常用的逻辑门电路与非门,详细分析了电源原理。值得收藏。

ManagerUser的博客 5086

利用openssl对数据进行md5加密 (Linux/C++)

一、Linux进行md5加密 1、md5加密 (1)交互式输入 $ openssl OpenSSL> md5 1234abcd(stdin)= ef73781effc5774100f87fe2f437a435 #输入完后按crtl+d三次 OpenSSL> md5 1234abcd (stdin)= 3d7e6a56bd7757aee22a30a1ca75cdd0 #输入完后按回车

A_L_A_N 9199

视频预处理--经典方法卷积3D

在三维卷积操作中,卷积核不仅在空间维度上滑动,还在时间维度上滑动,从而同时捕捉时间和空间上的特征。通过合理设置步长和填充,可以灵活控制输出特征图的大小和特征提取的效果。你的理解非常准确:三维卷积核就像是一个长度为 3 的滑动窗口,每次选取 3 个连续的帧进行卷积操作,而步长和填充则进一步优化了这一过程。

m0_73359068的博客 1649

MD5算法的C代码实现及测试

本程序主要是通过 rfc1321.txt 整理而来。这个文件可以在下面的地址下载。 http://www.ietf.org/rfc/rfc1321.txt 本程序在VC 2003 .NET 和 Dev C++ 4.9  下编译通过。 #include typedef struct {    unsigned int state[4];          unsi

ammana_babi的专栏 1万+

HAL库STM32CubeMX+DHT11温湿度传感器模块化驱动与OLED显示实战

本文详细介绍了基于HAL库和STM32CubeMX开发DHT11温湿度传感器模块化驱动的实战过程。通过精确的时序控制和模块化封装,实现了传感器数据采集,并结合OLED显示模块实时展示温湿度信息,为嵌入式开发者提供了完整的解决方案。

h6j7k8l9p0的博客 1131

J-Flash手动添加华大HC32F460型号全攻略

在嵌入式开发中,Flash编程算法是连接调试工具与微控制器的重要桥梁,它定义了芯片存储器的擦除、编程和校验等底层操作规范。其原理是通过调试接口将算法代码加载到目标芯片的RAM中执行,从而实现对Flash存储器的访问与控制。这项技术的核心价值在于打破了工具链对芯片型号的固有支持限制,使得开发者能够灵活适配各种新兴或定制化的微控制器。在工程实践中,当面对J-Link等主流调试器官方支持包更新滞后时,手动添加芯片型号成为保障开发效率的关键技能。本文以华大半导体的HC32F460系列MCU为例,详细解析了如何通过配

weixin_29192365的博客 348

VSCode配置C/C++教程

使用VSCode优雅的书写C/C++代码

Zhangguohao666的博客 3万+

揭秘Synopsys EDA中的AI黑科技:DSO.ai如何改变传统芯片设计流程

本文深入探讨了Synopsys EDA中的AI黑科技DSO.ai如何革新传统芯片设计流程。通过数据驱动的方法论、功耗优化革命和时序收敛智能加速,DSO.ai显著提升了设计效率和质量,实现了从经验驱动到AI驱动的范式转变。文章还提供了实战指南,帮助团队跨越AI EDA的实施鸿沟。

weixin_29296241的博客 523

iOS开发MD5/SHA1加密算法

Objective-c实现MD5和SHA1算法相对还是比较简单的,可以直接调用系统的C/C++共享库来实现调用 MD5即Message Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一 SHA即Secure Hash Algorithm(安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST)

leewolf 1271

【基于 CasADi 的欠驱动无人船实时非线性模型预测控制(NMPC)实现 Visual Studio 2022 C++】

本文介绍了基于CasADi和IPOPT在Visual Studio 2022 C++环境下实现的欠驱动无人船实时非线性模型预测控制(NMPC)方案。文章详细阐述了NMPC基本原理、欠驱动无人船动力学模型(包含状态变量和控制变量定义),并给出了C++实现的核心代码框架。该方案通过显式引入系统动力学模型和约束条件,在每个采样周期滚动优化控制序列,有效解决了欠驱动无人船的轨迹跟踪与避碰问题。文中还提供了VS2022配置CasADi环境的详细步骤,包括预编译包下载、工程属性设置等关键环节,为工程实现提供了完整的技术

vor234的博客 650

问答式AI vs 智能体(Agent):它们有什么不同?

你肯定用过 ChatGPT 或文心一言——问它一个问题,它给你一个答案。AI Agent(AI智能体)。很多人搞不清楚:它们不都是"AI"吗?有什么区别?这篇文章用一个最简单的类比,彻底讲清楚这两者的本质差异。框架特点适合人群AutoGPT完全自主执行任务,链式思考开发者MetaGPT模拟团队协作,多角色分工开发者LangChain最流行的Agent开发框架开发者Dify可视化无代码搭建Agent非技术用户Coze(扣子)字节跳动出品,国内最易用普通用户WorkBuddy。

Johnny2004的专栏 445
上一篇: Cocos2dx杂记:PhysicsEditor 对应cocos2dx 3.x的接口封装
下一篇: C/C++:基础知识记录(堆和栈)
胖胖的战士
博客等级 码龄18年 104粉丝 98原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值