SM3算法C语言实现(无第三方库,带测试)
一、SM3算法介绍
SM3算法是中国国家密码管理局(OSCCA)于2010年发布的商用密码散列函数标准,属于我国自主设计的密码算法体系之一 ,标准文档下载地址为:SM3密码杂凑算法 。SM3算法输出长度为256位(32字节),与SHA-256类似,但采用了更适合国内安全需求的优化结构。SM3基于Merkle-Damgård迭代结构,通过填充、消息分组、扩展和压缩等步骤处理输入数据,确保任意长度的消息都能生成固定长度的摘要。作为我国密码行业标准(GM/T 0004-2012),SM3在政务、金融、物联网等领域广泛应用,是我国信息安全国产化的重要支撑。
SM3算法的核心流程包括消息填充、消息扩展和压缩函数三部分。首先,输入数据会被填充至512位的整数倍,并附加长度信息。随后,消息分组通过扩展算法生成132个32位字,供压缩函数使用。压缩函数采用64轮非线性迭代运算,结合与、或、异或、模加法等操作,并引入多个常量进行混淆,确保雪崩效应(微小输入变化导致输出巨大差异)。SM3的设计在安全性和效率上取得平衡,能够有效抵抗碰撞攻击、长度扩展攻击等威胁。
二、C语言实现
SM3算法的C语言实现主要由基础函数、核心处理流程和整体控制三部分组成。
1. 基础函数
在基础运算函数中,循环左移函数RL采用先左移再右移的组合方式实现32位字的循环移位,确保位移结果正确。Tj函数根据轮数返回不同的常量值,前16轮返回0x79cc4519,后续轮次返回0x7a879d8a。FF和GG这两个布尔函数通过条件判断自动切换运算逻辑,前者在后期采用(X&Y)|(X&Z)|(Y&Z),后者则使用(X&Y)|(~X&Z)。
2. 核心处理流程
核心处理函数sm3_one_block实现了算法的关键计算流程。消息扩展阶段先将输入的16个字存入数组,然后递归生成68个扩展字,每个新字由Wj0[i-16]、Wj0[i-9]和循环左移15位的Wj0[i-3]经过P1置换后,再与循环左移7位的Wj0[i-13]和Wj0[i-6]异或得到。
压缩阶段执行64轮迭代,每轮计算SS1和SS2两个中间值,其中SS1需要对A、E变量和Tj常量进行多重位移和模加运算。工作变量的更新采用级联方式,B、C、D依次赋值,F、G、H也类似处理,而A和E则分别接收TT1和P0(TT2)的新值。
3. 整体控制
主控函数sm3_get_hash负责处理输入数据的组织工作。对于完整的数据块直接调用sm3_one_block处理,对最后不足64字节的数据需要特殊处理。填充过程首先计算剩余数据长度,确定填充位的位置,在数据末尾添加0x80标志位,并用0x00填充剩余空间,最后64位存放原始消息长度的二进制表示。当剩余空间不足64位时,函数会先处理一个填充块,再单独处理一个包含长度信息的块。
具体代码如下:
#include<stdio.h>
#include<stdint.h>static const uint32_t IV[8] = {0x7380166f, 0x4914b2b9, 0x172442d7, 0xda8a0600,0xa96f30bc, 0x163138aa, 0xe38dee4d, 0xb0fb0e4e
};uint32_t Tj(uint8_t j) {if (j < 16)return 0x79cc4519;return 0x7a879d8a;
}uint32_t FF(uint32_t X, uint32_t Y, uint32_t Z, uint8_t j) {if (j < 16)return X ^ Y ^ Z;return (X & Y) | (X & Z) | (Y & Z);
}uint32_t GG(uint32_t X, uint32_t Y, uint32_t Z, uint8_t j) {if (j < 16)return X ^ Y ^ Z;return (X & Y) | ((~X) & Z);
}uint32_t RL(uint32_t a, uint8_t k) {k = k % 32;return ((a << k) & 0xFFFFFFFF) | ((a & 0xFFFFFFFF) >> (32 - k));
}uint32_t P0(uint32_t X) {return X ^ (RL(X, 9)) ^ (RL(X, 17));
}uint32_t P1(uint32_t X) {return X ^ (RL(X, 15)) ^ (RL(X, 23));
}void sm3_one_block(uint32_t *hash, const uint32_t *block) {uint32_t Wj0[68];uint32_t Wj1[64];uint32_t A = hash[0], B = hash[1], C = hash[2], D = hash[3];uint32_t E = hash[4], F = hash[5], G = hash[6], H = hash[7];uint32_t SS1, SS2, TT1, TT2;uint8_t i, j;for (i = 0; i < 16; i++) {Wj0[i] = block[i];}for (i = 16; i < 68; i++) {Wj0[i] = P1(Wj0[i - 16] ^ Wj0[i - 9] ^ RL(Wj0[i - 3], 15)) ^ RL(Wj0[i - 13], 7) ^ Wj0[i - 6];}for (i = 0; i < 64; i++) {Wj1[i] = Wj0[i] ^ Wj0[i + 4];}for (j = 0; j < 64; j++) {SS1 = RL((RL(A, 12) + E + RL(Tj(j), j)) & 0xFFFFFFFF, 7);SS2 = SS1 ^ (RL(A, 12));TT1 = (FF(A, B, C, j) + D + SS2 + Wj1[j]) & 0xFFFFFFFF;TT2 = (GG(E, F, G, j) + H + SS1 + Wj0[j]) & 0xFFFFFFFF;D = C;C = RL(B, 9);B = A;A = TT1;H = G;G = RL(F, 19);F = E;E = P0(TT2);}hash[0] = (A ^ hash[0]);hash[1] = (B ^ hash[1]);hash[2] = (C ^ hash[2]);hash[3] = (D ^ hash[3]);hash[4] = (E ^ hash[4]);hash[5] = (F ^ hash[5]);hash[6] = (G ^ hash[6]);hash[7] = (H ^ hash[7]);
}void sm3_get_hash(uint32_t *src, uint32_t *hash, uint32_t len) {uint8_t last_block[64] = {0};uint32_t i = 0;for (i = 0; i < 8; i++) {hash[i] = IV[i];}for (i = 0; i < len; i = i + 64) {if (len - i < 64)break;sm3_one_block(hash, src + i);}uint32_t last_block_len = len - i;uint32_t word_len = ((last_block_len + 3) >> 2) << 2;uint32_t last_word_len = last_block_len & 3;for (int j = 0; j < word_len; j++)last_block[j] = *((uint8_t *) src + i + j);switch (last_word_len) {case 0:last_block[word_len + 3] = 0x80;break;case 1:last_block[word_len - 4] = 0;last_block[word_len - 3] = 0;last_block[word_len - 2] = 0x80;break;case 2:last_block[word_len - 4] = 0;last_block[word_len - 3] = 0x80;break;case 3:last_block[word_len - 4] = 0x80;break;default:break;}if (last_block_len < 56) {uint32_t bit_len = len << 3;last_block[63] = (bit_len >> 24) & 0xff;last_block[62] = (bit_len >> 16) & 0xff;last_block[61] = (bit_len >> 8) & 0xff;last_block[60] = (bit_len) & 0xff;sm3_one_block(hash, (uint32_t *) last_block);} else {sm3_one_block(hash, (uint32_t *) last_block);unsigned char lblock[64] = {0};uint32_t bit_len = len << 3;lblock[63] = (bit_len >> 24) & 0xff;lblock[62] = (bit_len >> 16) & 0xff;lblock[61] = (bit_len >> 8) & 0xff;lblock[60] = (bit_len) & 0xff;sm3_one_block(hash, (uint32_t *) lblock);}
}
三、正确性测试
我们编写了下面的代码进行正确性验证,这是SM3标准文档中的两个测试向量:
void test_case1() {uint32_t src[1] = {0x61626300};uint32_t hash[8];uint32_t len = 3;sm3_get_hash(src, hash, len);printf("hash(hex): ");for (int i = 0; i < 8; i++) {printf("%08x ", hash[i]);}printf("\n");
}void test_case2() {uint32_t src[16] = {0x61626364, 0x61626364, 0x61626364, 0x61626364, 0x61626364, 0x61626364, 0x61626364, 0x61626364,0x61626364, 0x61626364, 0x61626364, 0x61626364, 0x61626364, 0x61626364, 0x61626364, 0x61626364};uint32_t hash[8];uint32_t len = 64;sm3_get_hash(src, hash, len);printf("hash(hex): ");for (int i = 0; i < 8; i++) {printf("%08x ", hash[i]);}printf("\n");
}int main() {test_case1();test_case2();return 0;
}
代码执行结果如下,我们的代码通过了测试。
四、总结
本次实现的SM3算法C语言版本完整呈现了该密码哈希算法的核心机制。实现过程严格遵循标准规范,通过模块化设计将算法分解为初始化、消息扩展、压缩函数等关键组件。代码采用高效的位运算和指针操作,正确处理了消息填充、分组处理等边界情况。两个标准测试用例的验证结果表明,该实现正确产生了符合预期的哈希值。整体实现既保证了算法准确性,又展现了良好的代码结构和可读性,为后续的性能优化和应用集成奠定了坚实基础。
相关文章:
SM3算法C语言实现(无第三方库,带测试)
一、SM3算法介绍 SM3算法是中国国家密码管理局(OSCCA)于2010年发布的商用密码散列函数标准,属于我国自主设计的密码算法体系之一 ,标准文档下载地址为:SM3密码杂凑算法 。SM3算法输出长度为256位(32字节&a…...
King’s LIMS 系统引领汽车检测实验室数字化转型
随着汽车保有量的持续攀升和车龄的增长,消费者对汽车的需求已悄然转变,从最初对外观和性能的追求,逐渐深化为对安全性、可靠性、耐久性、性能与舒适性以及智能化功能的全方位关注。这无疑让汽车检测行业在保障车辆质量、满足市场需求方面肩负…...
CppCon 2017 学习:Mocking Frameworks Considered
当然可以,下面是对 Fowler 的 Whiskey-Store 示例。 Fowler 的 Whiskey-Store 示例(坏设计) 贴出的类图是 Martin Fowler 在《重构》书中使用的一个教学用反面案例(故意设计得不合理),用来说明如何通过重…...
通过事件过滤器拦截QRadioButton点击事件
通过事件过滤器拦截QRadioButton点击事件 一、事件过滤器完整实现 1. 核心代码扩展(含注释) bool MainWindow::eventFilter(QObject* obj, QEvent* ev) {// 拦截所有QRadioButton的鼠标事件(包括点击、释放、双击)if (ev->ty…...
领码 SPARK 融合平台赋能工程建设行业物资管理革新——数智赋能,重塑中国模式新范式
摘要 工程建设行业正加速迈向数字化与精益化转型,物资管理成为项目成败的关键瓶颈。本文深入解析中国工程企业“项目部-物资部-企业项目管理部”三级协同的独特物资管理体系,聚焦集中采购与零星采购的统筹难题。基于领码 SPARK 融合平台,提出…...
“地标界爱马仕”再启:世酒中菜联袂陈汇堂共筑新会陈皮顶奢产业
“地标界爱马仕”再启战略新篇:世酒中菜联袂陈汇堂,共筑新会陈皮顶奢产业生态 ——中世国际与陈汇堂股权合作签约仪式在国际地理标志服务基地举行 江门市新会区,2025年6月20日——被誉为“地标界爱马仕”的全球顶奢品牌运营商世酒中菜 &…...
.Net Framework 4/C# 数据访问技术(ADO.NET)
一、数据库基础 (一) 数据库简介 数据库是按照数据结构来组织、存储和管理数据的仓库,是存储在一起的相关数据的集合。 (二) SQL 语言简介 SQL 是一种数据库查询和程序设计语言,用于存取数据以及查询,更新和管理关系型数据库系统。在编写 SQL 语句时,SQL 语句各关键字要以…...
北京京东,看看难度
最近由于三大外卖平台“打仗”,优惠券多到数不过来,一日三餐每个平台各点一单哈哈哈,正好最近组织内部还有朋友在北京的京东面试过,分享一下她的面经(Java岗): 1. Kafka消息不丢失问题…...
RPGMZ游戏引擎 如何手动控制文字显示速度
直接上代码 const _Window_Base_prototype_initialize Window_Base.prototype.initialize;Window_Base.prototype.initialize function(rect) {_Window_Base_prototype_initialize.call(this, rect);this.文字速度缓冲 0;}; this.文字速度缓冲 0; 进行缓冲 Window_Base…...
linux线程同步
互斥锁 同步与互斥概述** 现代操作系统基本都是多任务操作系统,即同时有大量可调度实体在运行。在多任务操作系统中,同时运行的多个任务可能: 都需要访问/使用同一种资源 多个任务之间有依赖关系,某个任务的运行依赖于另一个任…...
大内存对电脑性能有哪些提升
在科技飞速发展的今天,电脑已经成为我们生活和工作中不可或缺的伙伴。无论是日常办公、追剧娱乐,还是进行复杂的游戏和专业设计,电脑的性能都至关重要。而在影响电脑性能的众多因素中,内存大小常常被人们忽视。 多任务处理更流畅…...
什么是“微博养铁粉”以及如何增加微博铁粉
发了个发微博养铁工具_微博养铁粉的定义 微博养铁粉是指粉丝通过与博主的互动,成为博主的铁粉。铁粉是微博推出的一种反映粉丝与博主之间亲密度的互动产品。成为铁粉后,粉丝的评论权重增加,更容易上前排,点赞和评论的效果也会更好…...
华为和H3C服务器配置远控管理地址
1、华为RH2288_V3服务器 1.1、启动服务器按DEL按键进入服务器bios 1.2、选择Advanced菜单中的 IPMI iBMC Configuration配置项回车进入。 1.3、IPMI iBMC Configuration配置界面中选择IBMC Configuration配置项回车进入。 1.4、IBMC Configuration 配置项中配置IPV4 Configura…...
Git 查询与切换分支的完整指南
Git 查询与切换分支的完整指南 1. 查询分支列表 查看本地分支 git branch当前分支会以绿色显示并带有 * 标记添加 -v 或 -vv 查看更详细的信息(最后一次提交和跟踪关系) git branch -v # 或者 git branch -vv查看所有分支(包括远程分支&a…...
Spring 中的依赖注入(DI)详解
📌 摘要 在现代 Java 开发中,依赖注入(Dependency Injection, DI) 是 Spring 框架最核心的功能之一。它通过解耦对象之间的依赖关系,提高了代码的可维护性、可测试性和可扩展性。 本文将全面讲解 Spring 中依赖注入的…...
Bytebase 3.7.1 - 数据库变更功能全免费!
🔔 重大变更 所有数据库变更相关功能现已在社区版中完全免费开放!详情请查看我们的最新定价。 🎄 改进 文档网站全面升级,改进导航、搜索功能,以及与 AI 集成自助回答问题。SQL 编辑器现在会高亮光标所在的语句。SQ…...
深度学习笔记27-LSTM实现糖尿病探索与预测(Pytorch)
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 一、前期准备 1.数据导入 import torch.nn as nn import torch.nn.functional as F import torchvision,torch import numpy as np import pandas as pd impo…...
3DS中文游戏全集下载 任天堂3DS简介3DS第一方独占游戏推荐
任天堂3DS 的详细介绍,涵盖其硬件特性、核心功能、游戏阵容及历史地位: 3DS游戏全集下载 https://pan.quark.cn/s/dd40e47387e7 https://sink-698.pages.dev/3ds CIA CCA 等格式可用于3DS模拟器和3DS实体机 3DS 是什么? 全称:Nin…...
vue3 reactive重新赋值
在 Vue 3 中,如果你想使用 reactive API 来创建一个响应式对象,并且之后需要更新这个对象中的属性,你可以按照以下步骤进行: 1. 使用 reactive 创建响应式对象 首先,你需要从 Vue 的 reactive API 中创建一个响应式对…...
全面掌握 C++ 基础:关键特性与进化
文章目录 全面掌握 C 基础:关键特性与进化1. C 关键字2. 命名空间(namespace)⚠️ 示例 2.1 定义命名空间2.2 使用成员的方法 3. C 输入/输出(iostream)4. 缺省参数(Default Parameter)4.1 定义…...
HTML一键打包EXE串口API介绍
HTML一键打包EXE软件(HTML转EXE) 支持将Web前端项目转换为Windows平台下的独立可执行程序(EXE),适用于Windows 7及以上系统,无需额外配置系统环境, 软件包含多种内核, 包括IE内核, Chrome内核, 以及WebView2(永久免费), 适用于不同…...
.docx 和 .doc 都是 Word 文档格式的区别
.docx 和 .doc 都是 Word 文档格式,但有区别: .docx 是新版 Word 格式(推荐使用) 从 Microsoft Word 2007 起引入的格式全名是:Office Open XML Document实际是一个 压缩包(ZIP)结构࿰…...
如何轻松地将音乐从 iPhone 传输到 Mac?
想把音乐从 iPhone 传输到 Mac 吗?这很常见,无论你是想更换设备、备份收藏,还是只想在更大的屏幕上欣赏喜爱的歌曲。幸运的是,有 6 种有效的方法可以完成这项工作,具体取决于你喜欢使用的工具。让我们开始吧。 第 1 部…...
Qwen3 Embedding 结构-加载-训练 看透模型设计哲学
看透一个顶级AI句向量模型的设计秘密,从文件结构到加载原理,再到其背后的训练哲学。 1 Qwen3-Embedding模型结构拆解 说明:目录包含了运行一个基于 Transformer 的句向量模型所需的所有组件 文件类别核心文件作用核心模型model.safetensors…...
AT8548双通道 H 桥电机驱动芯片
AT8548 是一种双通道低饱和电压的正、反向电机驱动芯片,为玩具、打印机和其它电机一体化应用提供一种双通道电机驱动方案。 特点: 双通道H桥电机驱动器; 驱动两个直流有刷电机或者一个步进电机; 低RDS(ON)电阻,1.06Ω(…...
kubeadm worker节点加入master失败
文章目录 1、操作2、问题现象3、问题原因4、问题解决4.1、重新生成token4.2、重新生成hash值 5、验证 1、操作 执行以下命令,让worker节点加入到master节点 kubeadm join 103.123.222.241:6443 --token vxe3v1.wzpnks8v1vbbtsu0 --discovery-token-ca-cert-hash s…...
Maven 之工程化开发核心指南:插件配置、pom 文件与依赖管理
目录 1. 🧩Maven插件 2. 🏗️构建Maven工程 3. 📄 pom文件配置 3.1. ⚙️ 中定义一些配置信息 3.2. 📦 中定义依赖的jar包坐标 3.3. 🔌 中定义第三方插件 4. ✍️编写代码 5. 🔗依赖范…...
分布式系统中的 Kafka:流量削峰与异步解耦(二)
Kafka 在分布式系统中的应用案例 电商订单系统 在电商领域,订单系统是核心业务模块之一,涉及多个复杂的业务环节和系统组件之间的交互。以常见的电商购物流程为例,当用户在电商平台上下单后,订单创建服务会首先接收到用户的订单…...
从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页
如果php.ini已经加入了如下的内容还是报错 : upload_max_filesize 1024M post_max_size 1024M 那就是因为阿帕奇导致:...
FramePack 安装指南(中文)
FramePack 安装指南(中文) -Windows FramePack 是最前沿的 AI 视频生成框架,以极小的硬件需求颠覆视频创作!它能在仅 6GB 笔记本 GPU 内存上,驱动 13B 模型以 30 FPS 生成超长 120 秒视频,几乎无内容限制&…...
【NLP入门系列三】NLP文本嵌入(以Embedding和EmbeddingBag为例)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 博主简介:努力学习的22级本科生一枚 🌟;探索AI算法,C,go语言的世界;在迷茫中寻找光芒…...
电子电气架构 --- 软件供应商如何进入OEM体系
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...
检索增强生成(RAG)领域关键数据集综述:分类、挑战与展望
检索增强生成(RAG)领域关键数据集综述:分类、挑战与展望 摘要 检索增强生成(RAG)通过融合外部知识库与大型语言模型,已成为解决知识密集型自然语言处理(NLP)任务的关键范式。高质量…...
CFD仿真计算革命:基于GPU的格子玻尔兹曼方法(LBM)算子优化——利用Tensor Core加速碰撞核计算(性能提升3倍实测)
点击 “AladdinEdu,同学们用得起的【H卡】算力平台,注册即送H800算力”,H卡级别算力,按量计费,灵活弹性,顶级配置,学生专属优惠。 在计算流体动力学领域,格子玻尔兹曼方法正以介观模…...
【蓝牙】Qt4中向已配对的手机发送PDF文件
在Qt 4中实现通过蓝牙向已配对的设备发送文件(例如PDF文件),你可以使用Qt Bluetooth模块。Qt 4的蓝牙模块提供了基本的蓝牙功能,包括设备发现、配对管理和数据传输。下面是一些步骤和示例代码,帮助你通过蓝牙发送PDF文…...
Vue + AbortController 请求取消弹窗 hook 封装
背景 实际业务开发场景中,往往存在有些大数据请求的需求,一旦请求发起加载遮罩后用户就无法操作了,直接尬住,所以提供一个支持取消查询的功能还是很有必要的,为了在全业务接口都能使用封装一个hook。 ✋为什么要用 A…...
在小程序中实现上下左右拖动表格
在小程序的开发中,不可避免会出现上下左右拖动表格的类似需求,下面将把这个简单实现一下 其中主要使用到了overflow: scroll;来使得横向和纵向可以滚动,并且使用负边距 父容器截断的方法来同时隐藏横向和纵向滚动条,从而实现该效…...
Spark 以及 spark streaming 核心原理及实践
导语 spark 已经成为广告、报表以及推荐系统等大数据计算场景中首选系统,因效率高,易用以及通用性越来越得到大家的青睐,我自己最近半年在接触spark以及spark streaming之后,对spark技术的使用有一些自己的经验积累以及心得体会&…...
数据融合平台是什么?如何搭建数据融合平台?
目录 一、数据融合是什么 1. 定义 2. 作用 二、数据融合平台的功能是什么 1. 数据抽取 2. 数据清洗 3. 数据转换 4. 数据关联 5. 数据存储 三、如何让搭建数据融合平台 1. 需求分析 2. 选择合适的技术和工具 3. 设计平台架构 4. 开发和部署平台 5. 数据迁移和融…...
Linux之线程同步与互斥
目录 一、线程互斥 1.1、进程线程间的互斥相关背景概念 1.2、互斥量mutex 1.2.1、互斥量的接⼝ 1.3、互斥量实现原理探究 1.4、互斥量的封装 二、线程同步 2.1、条件变量 2.2、同步概念与竞态条件 2.3、条件变量函数 2.4、⽣产者消费者模型 2.4.1、为何要使⽤⽣产者…...
uniapp开发小程序,导出文件打开并保存,实现过程downloadFile下载,openDocument打开
uniapp开发小程序,导出文件打开并保存 实现思路 1、调用请求获取到后端接口返回的下载文件的url路径 (注意必须是https的路径,域名需要配置在微信小程序后台的合法域名里面) 2、使用 uni.downloadFile 方法 (下载文件…...
腾讯云COS“私有桶”下,App如何安全获得音频调用流程
流程图 #mermaid-svg-Phy4VCltBRZ90UH8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Phy4VCltBRZ90UH8 .error-icon{fill:#552222;}#mermaid-svg-Phy4VCltBRZ90UH8 .error-text{fill:#552222;stroke:#552222;}#me…...
简单的 Flask 后端应用
from flask import Flask, request, jsonify, session import os app Flask(__name__) app.secret_key os.urandom(24) users { 123: admin, admin: admin } # 登录接口 app.route(/login, methods[POST]) def login(): data request.get_json() username data.get(usern…...
Android 中 解析 XML 字符串的几种方式
在 Android 开发中,解析 XML 文件有多种方式,每种方式都有其特点和适用场景。常见的 XML 解析方式有 DOM 解析、SAX 解析 和 XmlPullParser 解析。 1、DOM 解析 DOM(Document Object Model)解析是一种基于树结构的解析方式&#…...
git commit
git commit 是版本控制的核心操作之一,用于将暂存区的修改记录为新的版本提交。以下是关键步骤和最佳实践: 基础操作 提交单个文件: bash Copy Code git commit -m “提交信息” 提交多个文件: bash Copy Code …...
【新手向】GitHub Desktop 的使用说明(含 GitHub Desktop 和 Git 的功能对比)
GitHub Desktop 是 GitHub 公司推出的一款桌面应用程序,旨在帮助开发人员更轻松地使用 GitHub,以下是其简单的使用说明: 安装与登录 下载 GitHub Desktop |GitHub 桌面 访问GitHub Desktop 官方网站,根据自己的操作系统下载对应的…...
Tomcat项目本地部署(Servlet为例)
在Windows上部署 在idea中打开项目 首先我们需要准备一个Servlet项目,我之前的Servlet项目是用eclipse写的,这种情况下如果用idea直接打开的话会出现左侧目录无法显示的情况,这个时候我们就需要用别的方法打开 打开项目管理 如下图&#…...
Linux——linux的基本命令
目录 一、linux的目录结构 二、绝对路径和相对路径 三、文件类型(linux下所有东西都可看作文件) 四、文件的权限 五、文件权限的修改(chmod) 六、linux常用的命令 七、文件查看命令 八、文件编辑命令 九、文件压缩与解压…...
wireshark过滤显示rtmp协议
wireshark中抓包显示的数据报文中,明明可以看到有 rtmp 协议的报文,但是过滤的时候却显示一条都没有 查看选项中的配置,已经没有 RTMP 这个协议了,已经被 RTMPT 替换了,过滤框中输入 rtmpt 过滤即可...
Fiddler抓包工具使用技巧:如何结合Charles和Wireshark提升开发调试效率
在开发过程中,网络调试工具是每个程序员的必备利器,特别是当涉及到Web应用和移动应用的调试时,抓包工具的作用尤为突出。无论是处理复杂的API调用、分析性能瓶颈,还是排查网络通信问题,抓包工具都能够帮助开发者精准地…...