Python3 积累一些简单文件传输协议(TFTP)的知识点

从Xmodem到Zmodem:聊聊那些年我们用过的串口文件传输协议,为什么Ymodem-1K至今还在用? 本文探讨了串口文件传输协议从Xmodem到Zmodem的进化历程,重点分析了Ymodem-1K在工业领域的持久生命力。通过对比测试数据和实际应用场景,揭示了Ymodem-1K因其可靠性、极简设计和广泛兼容性,至今仍是工业控制、医疗设备等关键领域的首选协议。 阅读详情


        做项目的时候,有时候便会和后台撕逼。有时候后台给的数据不是前端想要的。他还很固执的不想改。所以便觉得是时候包揽后台的活了。

闲话不多说,分享一下我对TFTP协议的一些理解

下载流程:

       

发送下载请求:


下载操作码为1,模式为octet

file_down_load_request = "!H" + str(len(fileName)) + "s" + "b" + "5s" + "b";
print(file_down_load_request)
tftp_down_request = struct.pack(file_down_load_request, 1, fileName, 0, "octet".encode("utf-8"), 0);

操作码为2个字节,H像是占位符一样占两个字节,模式octet占五个字节。注意编解码,这是我觉得p2与p3最让我蛋疼的地方

udpSocket.sendto(tftp_down_request, ("169.254.233.46", 69))
发送给服务端,注意这里是个元组(ip,端口)


接收数据包:



数据包的操作码为3占2个字节。整个数据包为516字节。也就是每次数据包最多返回512个字节。快编号的作用像是传递一个密钥,保证数据的是否已经下到了。当客户端下载到这个数据包时,拿到这个块编号,在发送给服务端,然后服务端再发送下一个数据包。(一想到之前有个socket控制项目,我就没想到用这个方式告诉服务端我已经接到消息,就是泪啊。看来自己功力不够)。快编号占两个字节,一个字节占八位也就16个字节,所以块编号最大为65536。那么问题来了,快编号最大为65536,那么我的下载数据最大就应该为512*65536也就是32M左右。那么超过32M怎么办呢?首先这个块编号是从1开始发的,到655537就会重置为1。

    recv_data, recv_adr = udpSocket.recvfrom(516)
    caozuoma, kuaibianhao = struct.unpack("!HH", recv_data[:4])
    print("操作码::%s" % caozuoma)  #
    print("块编号::%s" % kuaibianhao)
    # 块编号存放的是两位即16个字节=65536 从1开始

    # 返回的是正确的数据包;2(操作码)+2(快编号)+514b的数据

    if (caozuoma == 3):
        if(packNum>65536):
            packNum=0
        packNum += 1
        if (packNum == kuaibianhao):
            jieShouFile.write(recv_data[4:])
            downFileTotalSize+=len(recv_data[4:])
            packNum = kuaibianhao;
            print("文件当前下载的大小%d"%downFileTotalSize)
当收到数据包的时候,客户端还需要发送ack给服务端,告诉它,刚才发的块编号收到了,以便它发下一个块编号的数据包,ack为4个字节,两个字节操作码,2个字节快编号,以2个H占位4个字节


        ackData = struct.pack("!HH", 4, packNum)
        udpSocket.sendto(ackData, recv_adr)
服务端返回异常的数据包:如果收到了操作码为5的数据包这说明出现下载异常了




    elif (caozuoma == 5):
        print("tffp协议下载错误")
        break

那么还有一个问题就是如何判定是下载完成了呢?因为一个数据包最大为516个字节,那么当我收到小于516个字节的数据包,就能判定下载成功。貌似及时最后一个数据包的大小恰巧是516,那么它还会发一个数据为0的数据包来。

    if (len(recv_data) < 516):
        print("tffp协议下载完成")
        break

附件:下载完整代码,python3注意编解码啊,真的蛋疼

# tftp 简单文件传输协议
# 发送下载请求
import struct
import socket

fileName = "动态背景.rar".encode("gb2312");
print(len(fileName))
print(str(len(fileName)) + "s")
file_down_load_request = "!H" + str(len(fileName)) + "s" + "b" + "5s" + "b";
print(file_down_load_request)
tftp_down_request = struct.pack(file_down_load_request, 1, fileName, 0, "octet".encode("utf-8"), 0);
udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udpSocket.sendto(tftp_down_request, ("169.254.233.46", 69))
packNum = 0
jieShouFile = open("动态背景2.rar".encode("gb2312"), "wb+")
downFileTotalSize = 0;#记录下载进度
while True:
    recv_data, recv_adr = udpSocket.recvfrom(516)
    caozuoma, kuaibianhao = struct.unpack("!HH", recv_data[:4])
    print("操作码::%s" % caozuoma)  #
    print("块编号::%s" % kuaibianhao)
    # 块编号存放的是两位即16个字节=65536 从1开始

    # 返回的是正确的数据包;2(操作码)+2(快编号)+514b的数据

    if (caozuoma == 3):
        if(packNum>65536):
            packNum=0
        packNum += 1
        if (packNum == kuaibianhao):
            jieShouFile.write(recv_data[4:])
            downFileTotalSize+=len(recv_data[4:])
            packNum = kuaibianhao;
            print("文件当前下载的大小%d"%downFileTotalSize)

        # 确认操作 :4个字节
        ackData = struct.pack("!HH", 4, packNum)
        udpSocket.sendto(ackData, recv_adr)
    elif (caozuoma == 5):
        print("tffp协议下载错误")
        break
    # 判定下载完成
    if (len(recv_data) < 516):
        print("tffp协议下载完成")
        break

udpSocket.close()
jieShouFile.close()

那么我要像服务端上传文件该怎么弄呢,其实原理是差不多的,只不过改为我来发数据包,服务端确认,两个难点:1.服务端的端口是变的,切记传入服务端的元组地址。2.P3编解码真的恶心,判断文件读取结束的条件注意编码格式

show code

附件:上传文件

# tftp 简单文件传输协议
# 上传文件
import struct

# 定义几个变量
# 要上传到服务端的文件名
uploadToServerFileName = "HelloWorld.mkv".encode("utf-8");
# 上传进度
uploadProgress = 0;
# 起始的快编号标记
kuaiBiaoHaoFlag = 0;
# 建立UDP
import socket

udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
# 建立读写请求
file_upload_request = "!H" + str(len(uploadToServerFileName)) + "s" + "b" + "5s" + "b";
tftp_upload_request = struct.pack(file_upload_request, 2, uploadToServerFileName, 0, "octet".encode("utf-8"), 0)
udpSocket.sendto(tftp_upload_request, ("169.254.164.219", 69))
# 要上传的文件
ready_to_upload_file = open("HelloWorld.mkv".encode("utf-8"), "rb+")

while True:


    recv_data, recv_adr = udpSocket.recvfrom(516)
    print(recv_data)
    caozuoma, kuaibianhao = struct.unpack("!HH", recv_data[:4])
    print("操作码::%s" % caozuoma)  #
    print("块编号::%s" % kuaibianhao)

    if (caozuoma == 4):

        if (kuaibianhao == kuaiBiaoHaoFlag):
            print("服务端已经收到了我的数据,准备上传下一个")
            # 开始上传数据,此时要像服务端发送数据包,数据大小最大为512
            kuaiBiaoHaoFlag += 1;
            data = ready_to_upload_file.read(512);
            print(data)
            if(data==("".encode("utf-8"))):
                print("上传结束")
                break

            if (kuaibianhao == 65535):
                kuaiBiaoHaoFlag = 0
                kuaibianhao = 0

            # 数据包
            data_request = "!H" + "H" + str(len(data)) + "s"
            shujuBao = struct.pack(data_request, 3, kuaiBiaoHaoFlag, data)
            udpSocket.sendto(shujuBao, recv_adr)


        else:
            print("服务端没收到我上传的数据")
            break

udpSocket.close()
ready_to_upload_file.close()






iPXE网络启动实战:告别U盘,实现自动化系统部署 网络启动(PXE)是计算机领域实现远程系统安装和批量部署的基础技术,其核心原理是通过网卡固件从网络服务器获取引导程序,进而加载操作系统镜像。传统PXE依赖TFTP协议,传输速度慢且功能有限,难以满足现代高效部署的需求。iPXE作为增强版开源固件,通过支持HTTP、iSCSI等现代协议,解决了传输瓶颈,并引入脚本编程能力,实现了引导逻辑的灵活定制。其技术价值在于将系统部署从手动、本地化的操作,升级为可编程、网络化的自动化流程,极大地提升了运维效率。在应用场景上,iPXE广泛适用于数据中心服务器批量安装、企业办 阅读详情

相关推荐

飞腾派4G版Linux内核编译实战指南

Linux内核编译是嵌入式开发的核心技能,特别是在ARM架构的国产化平台如飞腾派上。交叉编译工具链的配置涉及gcc-aarch64-linux-gnu等关键组件,需要正确处理环境变量和架构参数。通过menuconfig界面进行内核配置时,需重点关注处理器特性、驱动支持和文件系统等模块。在工业控制和边缘计算场景中,定制化的内核能显著提升性能,例如调整CPU调度策略改善实时性。本文以飞腾派4G版为例,详解从工具链部署到内核烧录的全流程,特别分享设备树定制和常见编译错误的解决方案。

weixin_33859844的博客 358

python编写tftp服务器

tftp服务起下载文件 from socket import * import struct import os import sys def main(): if len(sys.argv) != 3: print("请按照规则运行程序:python3 xxx.py ip filename") exit() #服...

xiao-啸 2939

华为光猫配置加解密工具:原理、实战与安全指南

在网络设备管理中,配置文件是控制设备行为的核心数据载体,其加解密机制直接关系到设备的安全性与可管理性。对称加密算法(如AES、DES)因其效率高、速度快,常被用于保护这类配置文件的机密性,防止未授权访问和篡改。理解其原理,不仅能提升网络运维的深度,也为解决实际网络问题(如优化家庭宽带、开启桥接模式)提供了技术基础。华为光猫作为广泛部署的终端设备,其配置文件的加解密过程涉及特定的密钥体系与算法变种。掌握相关工具的使用,例如对`hw_ctree.xml`等加密文件进行离线解密与分析,便成为网络爱好者与运维人员进

weixin_34212762的博客 462

【亲测免费】 Tftpy:一个纯Python编写的TFTP库

Tftpy:一个纯Python编写的TFTP库 项目基础介绍及编程语言 Tftpy是一个专为Python编程语言设计的TFTP(简单文件传输协议)库。它采用了纯粹的Python实现,确保了跨平台的兼容性和易于集成到各种Python应用中。此项目托管在GitHub上,由Michael P. Soulier维护,并采用MIT许可证进行分发。 核心功能 Tftpy提供了一套完整的客户端与服务器端解决方案...

gitblog_00391的博客 603

华为光猫配置文件AES加密原理与解密工具实战指南

AES(高级加密标准)是一种广泛应用的对称加密算法,其核心原理是使用相同的密钥进行数据的加密和解密,通过多轮的替换、置换等操作确保数据安全。在家庭网络设备中,AES加密常用于保护配置文件,防止未授权访问和篡改,这对于设备制造商和运营商管理设备固件与参数至关重要。其技术价值在于平衡了安全性与性能,为大规模设备部署提供了可靠的配置保护机制。在光猫等网络终端设备场景中,运营商常使用硬编码的AES密钥对配置文件进行加密,以实现远程配置下发和设备管理。本文聚焦于华为光猫的配置文件解密,通过解析其AES加密机制,介绍如

weixin_33805992的博客 360

NXP Layerscape平台UEFI启动全流程解析:从TF-A到Linux内核

在嵌入式系统开发中,固件启动流程是系统稳定运行的基础。UEFI(统一可扩展固件接口)作为一种标准化的固件接口规范,为操作系统和平台固件之间定义了清晰的数据表和调用接口,其核心价值在于提供了一套模块化、标准化的启动管理方案。在基于Arm架构的高性能网络处理器领域,如NXP的QorIQ Layerscape系列平台,引入UEFI能够显著提升启动流程的标准化程度、安全启动支持以及与现代化操作系统的兼容性。其技术实现通常与ARM Trusted Firmware-A(TF-A)协同工作,构成从硬件初始化到操作系统加

ozzzzzz的专栏 528

【亲测免费】 TFTP Python (tftpy) 开源项目使用教程

TFTP Python (tftpy) 开源项目使用教程 项目概述 TFTPy 是一个用Python编写的简单TFTP(Trivial File Transfer Protocol)客户端和服务端库。此项目由msoulier维护,在GitHub上的仓库地址是 https://github.com/msoulier/tftpy.git。它旨在提供一个轻量级且易于集成到其他应用程序中的TFTP解决方案...

gitblog_00597的博客 882

玄铁RISC-V软件生态:从工具链到应用开发的实践指南

处理器软件生态是决定芯片能否广泛应用的关键,其核心在于工具链与操作系统支持。编译器、调试器等基础工具链是软件开发的起点,GCC和LLVM通过架构适配实现代码编译与优化。操作系统内核移植则涉及启动引导、设备树与驱动开发,为上层应用提供运行环境。在RISC-V架构下,这些基础组件的完善程度直接影响开发效率与产品落地速度。随着生态发展,中间件、高级语言运行时及图形框架的适配成为拓展应用场景的技术重点。本文聚焦玄铁RISC-V处理器,深入分析其工具链配置、Linux移植实践及交叉编译工作流,探讨从基础驱动调试到系统

weixin_30892763的博客 780

Python3简单的TFTP文件传输

TFTP文件传输功能:1、获取文件列表2、上传文件3、下载文件4、退出第一部分,TftpServer部分。①导入相关模块from socket import * import os import signal import sys import time②确定文件路径# 文件库路径 FILE_PATH = "/home/tarena/"③建立一个类,用来实现服务器功能模块class TftpSer...

5coder的大前端进阶之路-个人博客网站:blog.5coder.cn 2684

详解Python3的TFTP文件传输

TFTP文件传输 功能: 1、获取文件列表 2、上传文件 3、下载文件 4、退出 第一部分,TftpServer部分。 ①导入相关模块 from socket import * import os import signal import sys import time ②确定文件路径 # 文件库路径 FILE_PATH = "/home/tarena/" ③建立一个类,用来实现服务器功能模块 class TftpServer(object): def __init__(self, connfd): self.connfd = connfd def do_list(self)

西门子博图编程:使用S7-1500冗余PLC 建立ModbusTCP通信

文章目录1.1 网络结构1.2 系统 IP 介绍1.3 Modbus TCP 通讯编程1.3.1 CPU 做服务器 1.1 网络结构 以 CPU151 7H 为例, 网络结构示意如下图所示: CPU 1517H 冗余 PLC 有 PROFINET X1 接口和 X2 接口, Modbus TCP 通讯可以将设备(例如 Standard PLC)通过交换机接入到任何网络接口中。如果接入 X1 接口,需要通过交换机接入到 MRP 环网中,但是并不需要支持 H-sync 转发。如果接入 X2 接口,只需要使

2万+

华为光猫配置解密:从获取权限到修改回传的完整实战指南

网络设备配置管理是家庭与企业网络运维中的基础环节,其核心在于对设备配置文件的读写与解析。配置文件通常以加密或特定格式存储,以保障设备安全并防止误操作。理解其加密原理与解密技术,对于实现网络自定义优化、故障排查及提升网络自主控制权具有重要价值。尤其在光猫这类运营商定制设备上,掌握配置解密方法能有效解锁桥接模式、调整无线参数等高级功能,从而优化网络性能与拓扑结构。本文聚焦于华为光猫配置文件的实战解密流程,详细介绍了通过ONT工具开启Telnet、导出加密文件、使用Python脚本安全解密、分析XML结构以及修改

weixin_27875131的博客 420

Windows平台COLMAP实战:从零到三维重建的避坑指南

本文详细介绍了在Windows平台上使用COLMAP进行三维重建的完整流程,包括安装指南、数据准备技巧、图形界面操作及常见问题解决方案。特别针对Windows用户提供了CUDA版本与非CUDA版本的性能对比,帮助用户高效完成从照片到三维模型的重建过程。

weixin_29090677的博客 189

Cortex-A8 SoM嵌入式实战:从核心板选型到Linux部署避坑

嵌入式系统开发中,硬件设计周期与软件运行稳定性始终是两大核心挑战。System on Module(SoM)通过将处理器、内存、Flash等关键部件预集成于核心板,配合载板即可快速构成完整主板,大幅降低从零画板的硬件风险与时间成本。以经典Cortex-A8处理器(如TI AM335x)为例,其成熟的ARMv7-A生态与工业级寿命,使其在HMI、数据网关等场景下依然具备极高性价比。本内容围绕SoM方案,梳理了核心板与载板的设计要点、基于交叉编译工具链的Linux BSP移植流程,并针对部署阶段常见的运行时依赖

weixin_33946605的博客 472

Anaconda详细安装及使用教程(带图文)

Anacond的介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包,Anaconda的下载文件比较大(约531 MB),如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版(仅包含conda和Python)。 Conda是一个开源的包、环境管理器,可以用于...

代码帮 186万+

扣子Coze触发器使用指南:实现工作流定时执行的完整教程

Coze平台触发器功能详解:定时触发器配置指南 摘要:Coze平台的触发器是实现自动化任务的核心组件,其中定时触发器能够按预设时间自动执行工作流。本指南介绍了定时触发器的配置方法,包括每日、每周、每月及Cron表达式等多种时间设置方式,以及如何关联工作流执行具体任务。文章还提供了健身提醒等实用案例,并涵盖了触发器调试、发布及常见问题解决方案。通过合理配置定时触发器,用户可以轻松实现各类自动化任务,如定时发送消息、数据采集等,大幅提升工作效率。

互联网架构师笔记 1922

python网络编程学习笔记(2)--TCP和UDP区别(补充)

1: 面向报文 面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会是IP太小。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。 2: 面向字节流 面向字节流

vinsuan93的专栏 592

vue2/3 - 详细对接海康监控实时视频预览和录像回放功能,vue接入使用海康视频监控播放器实时推流等功能,支持hik/rtsp/rtmp/hls/ws取流协议(详细教程与示例代码,一键复制开箱即用

vue2,vue3,海康,vue海康视频监控,海康开放平台,如何接入海康的实时监控,海康威视,Vue实现海康监控视频播放,vue3对接海康视频监控播放、回放的方法流程,实现海康H5视频插件播放视频的实例,web网页接入海康,海康威视的视频vue的录像回放和实时预览,前端vue3项目接入海康威视h5player.js播放器,vue2接入海康威视视频监控平台,使用海康监控H5视频播放,对接海康视频监控,海康视频web插件,web前端在vue中通过海康插件嵌入视频,实现实时预览,vue3海康监控播放器组件,vue

✅ 精选推荐文章 1万+

网工常用对比文档软件大全,零基础入门到精通,收藏这篇就够了

*工具实战:**集中训练抓包工具(Wireshark)、渗透测试工具(Nmap)、漏洞扫描工具(Nessus 基础版)的使用,结合模拟场景练习工具应用(掌握基础扫描逻辑,为 SRC 漏扫工具进阶做准备)。实战技能训练:开展漏洞扫描、漏洞利用、电商系统渗透测试、内网渗透、权限提升(Windows、Linux)、代码审计等实战训练,结合运维中熟悉的系统环境设计测试场景(强化红蓝对抗攻击端技术能力)。操作路径:为中小型企业提供路由器、交换机、防火墙等设备的配置调试、性能优化及故障排查服务。

Libra1313的博客 786

【项目实战】TARA威胁分析和风险评估

TARA是信息安全领域中的一种风险评估方法,在汽车信息安全的上下文中,TARA分析特别重要,因为它可以帮助识别和管理与智能网联车辆相关的各种威胁,包括数据泄露、未经授权的访问、远程操控等。通过TARA分析,企业可以制定出针对性的安全目标、产品要求和产品安全声明,以确保汽车及其零部件符合相关的信息安全标准和法规。此外,TARA分析还可以与数字化建模系统结合,以更系统化和高效的方式进行风险评估和管理。

奶爸的编程之路,也就一周冷个三天 2709

python代码实现了一个基于图注意力网络(GAT)和长短期记忆网络(LSTM)的股票成交量预测模型

自定义数据集类:定义了类,继承自。该类用于生成股票数据的时间序列样本,每个样本包含一个长度为seq_length的时间序列和对应的目标成交量。数据加载器:使用DataLoader对数据集进行批量加载,设置批量大小为 64,并开启数据打乱功能。GAT - LSTM 模型:定义了GAT_LSTM类,继承自。该模型结合了 GAT 和 LSTM 两种神经网络:GAT 部分:使用GATConv处理全局图特征,捕获股票之间的相互关系。LSTM 部分:使用nn.LSTM处理时间序列数据,捕捉时间序列的动态变化。

huanghm88的专栏 424

运维工具推荐大全,零基础入门到精通,收藏这篇就够了

*工具实战:**集中训练抓包工具(Wireshark)、渗透测试工具(Nmap)、漏洞扫描工具(Nessus 基础版)的使用,结合模拟场景练习工具应用(掌握基础扫描逻辑,为 SRC 漏扫工具进阶做准备)。实战技能训练:开展漏洞扫描、漏洞利用、电商系统渗透测试、内网渗透、权限提升(Windows、Linux)、代码审计等实战训练,结合运维中熟悉的系统环境设计测试场景(强化红蓝对抗攻击端技术能力)。操作路径:为中小型企业提供路由器、交换机、防火墙等设备的配置调试、性能优化及故障排查服务。

leah126的博客 1091

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

网络运维工具整理大全,零基础入门到精通,收藏这篇就够了

工欲善其事必先利其器,作为网络工程师想要在工作中快速提高工作效率,就需要熟练使用相关工具的加持下,最终达到事半功倍的效果。本期就和大家推荐几款实用且使用简单的高效工具。对比软件-Beyond CompareBeyond Compare是一款非常好用的文本对比软件,小编经常用来割接的时候前后对比相关的参数信息是否一致,如路由表信息、arp信息、mac地址等。这样就能快速的看出缺少的部分路由等相关信息,方便我们排查问题。如下图所示,左右不一样的地方就会标红,方便我们查看。终端工具-IPOP 4.1。

QIANDXX的博客 886

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数通网络工程师成长路线:从基础到专家的完整指南

数通网络作为ICT基础设施的核心支柱,涉及从物理层到应用层的复杂协议栈。理解网络分层模型(如OSI七层模型)是基础,而协议如STP、OSPF、BGP等则是构建稳定网络的关键技术。掌握这些技术不仅能提升网络性能,还能优化架构设计,如数据中心Spine-Leaf架构和SD-WAN部署。在实际应用中,网络工程师需结合工具链(如Wireshark、eNSP)进行故障排查和性能优化。随着SDN和网络自动化(如Python脚本、Ansible)的普及,数通领域正迎来技术融合的新机遇。本文通过四个成长阶段(基础筑基、协议

weixin_30231327的博客 329

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: android 用java写一个自动适配各种屏幕大小的工具
下一篇: Android 积累一些RxJava2.0有关的知识
泡温泉的咸鱼
博客等级 码龄11年 39粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值