CRC8检验算法(C语言实现)

CRC8算法 crc8校验算法、原理、查表法、计算法、c代码 阅读详情
AI摘要

本文详细介绍了MSB-first CRC-8校验算法的原理与C语言实现,涵盖生成多项式(poly=0x31)、初始值(init=0x00)、非反射模式(refin=false, refout=false)及零异或输出(xorout=0x00)。重点解析仿人算推导、直接计算法(逐位移位异或)和查表法(256项预计算表),适用于嵌入式系统资源受限场景。

        本文仅用于本人学习记录,参考摘录了以下大佬的文章:

CRC8算法_算法_简单的过客-GitCode 开源社区 (youkuaiyun.com)

CRC算法原理、推导及实现 - QIYUEXIN - 博客园 (cnblogs.com)

        本文实现的是:width=8, poly=0x31, init=0x00, refin=false, refout=false, xorout=0x00 的 MSB-first CRC-8 实现。

目录

1.CRC-8 常用生成多项式

2.CRC校验算法

3.算法推导

3.1 仿人算方法

4.直接计算法:

5.查表法


1.CRC-8 常用生成多项式

CRC-8       x8+x5+x4+1              0x31(0x131)

CRC-8       x8+x2+x1+1              0x07(0x107)

CRC-8       x8+x6+x4+x3+x2+x1       0x5E(0x15E)

        注:“CRC-8”不是单一标准,除了多项式还要指定 init、refin、refout、xorout。不同参数组合会得到不同的 CRC 结果,实际使用时应以协议文档为准。代码中记录的 poly 通常省略最高项 x^8,例如 0x31 表示完整生成多项式 x^8 + x^5 + x^4 + 1。最高项并非“不参与运算”,而是在移位反馈实现中被隐式处理。

2.CRC校验算法

        CRC 本质是在 GF(2) 上对消息多项式进行模生成多项式除法;加减法等价于 XOR。实现中的 MSB-first 与 LSB-first 是不同的位序/反射方式,必须与协议规定的 refin、refout、初值和最终异或一起确定。

        对于MSB:XOR从数据的高位开始,暂时定义为顺序异或;

        对于LSB:XOR从数据的低位开始,暂时定义为反序异或;

        两种不同的异或方式,仅有相同 poly 不足以保证结果一致;init、refin、refout 和 xorout 任一不同,都可能得到不同 CRC。

3.算法推导

        CRC的算法是基于除法,但不能直接使用除法运算,由于待校验的数据可能会很长,而MCU可能并没有这么大的寄存器;

3.1 仿人算方法

        现在我们假设一个消息数据为1101011011,选取除数为10011,使用CRC算法将消息除以poly:

            1100001010 = Quotient (nobody cares about the quotient)
       _______________
10011 ) 11010110110000 = Augmented message (1101011011 + 0000)
 =Poly  10011,,.,,..|.
        -----,,.,,|...
         10011,.,,|.|.
         10011,.,,|...
         -----,.,,|.|.
              10110...
              10011.|.
              -----...
               010100.
                10011.
                -----.
                 01110
                 00000
                 -----
                  1110 = Remainder = THE CHECKSUM!!!!

        

        在数学表示中,生成多项式包含最高项。例如 0x131 表示 x^8+x^5+x^4+1。在 8 位左移反馈实现中,代码仅保存低 8 位反馈常量 0x31;当寄存器最高位移出时,代码通过与 0x31 异或来隐式完成最高项对应的反馈。

        因此,MSB-first 实现每处理一位,先判断当前 CRC 的最高位:若为 1,左移后再与 0x31 异或;若为 0,则只左移。这样无需保存完整的 9 位多项式。

        转换成算法的思路就是,你也可以理解成一长串的数据不断的从右边移位到寄存器中,当寄存器最左边溢出的数值是1的时候,那么当前寄存器的数据就可以和poly异或运算了,用算法表示,大概是这样:

                  3   2   1   0   Bits
                +---+---+---+---+
       Pop! <-- |   |   |   |   | <----- Augmented message
                +---+---+---+---+

             1    0   0   1   1   = The Poly


 

4.直接计算法:

typedef unsigned char           uint8_t; 
typedef unsigned short int      uint16_t;
#define CRC8_POLYNOMIAL         0x31 

/*计算多个字节CRC8校验值的函数*/
uint8_t cal_bytes_crc8(uint8_t *data, uint8_t len){ 
    uint8_t crc8 = 0x00;                         /* 计算的初始crc值 */ 
    uint8_t i ;
    while(len--){
        crc8 ^= *data++;                        /* 每次先与需要计算的数据异或,计算完指向下一数据 */  
        for (i = 8; i > 0; --i) {         /* 下面这段计算过程与计算一个字节crc一样 */  
            crc8 = ( crc8 & 0x80 )
              ? (crc8 << 1) ^ CRC8_POLYNOMIAL
              : (crc8 << 1);
        }
    }
    return crc8 ;
}

        上面的crc计算是纯采用逻辑运行的方式,可以看到,需要的运行量也是不少的,每一个字节都需要进行8次判断、移位、或异或操作。可以采用查表法,大大减少计算量,先计算0x00~0xFF每一个字节的crc校验结果,后面就可以通过表来查出每个字节的crc结果,大大减少计算量。


5.查表法

uint8_t cal_table_high_first(uint8_t value)
{
    uint8_t i, crc=0x00;
 
    crc = value;
    /* 数据往左移了8位,需要计算8次 */
    for (i=8; i>0; --i){ 
      crc = ( crc & 0x80 ) /* 判断最高位是否为1 */
        /* 最高位为1,不需要异或,往左移一位,然后与0x31异或 */
        /* 0x31(多项式:x8+x5+x4+1,100110001),最高位不需要异或,直接去掉 */
        ? (crc << 1) ^ CRC8_POLYNOMIAL
        /* 最高位为0时,不需要异或,整体数据往左移一位 */
        : (crc << 1);
    } 
 
    return crc;
}

// 下面是一个表生成程序:
void  create_crc_table(void)
{
    uint16_t i;
    uint8_t j;
 
    for (i=0; i<=0xFF; i++)
    {
        if (0 == (i%16))
            printf("\n");
 
        j = i&0xFF;
            printf("0x%.2x, ", cal_table_high_first (j));  /*依次计算每个字节的crc校验值*/
    }
}




// 按照多项式 x^8 + x^5 + x^4 + 1(poly=0x31)生成。
static const unsigned int crc8_table[256] =
{
  0x00, 0x31, 0x62, 0x53, 0xc4, 0xf5, 0xa6, 0x97, 0xb9, 0x88, 0xdb, 0xea, 0x7d, 0x4c, 0x1f, 0x2e, 
  0x43, 0x72, 0x21, 0x10, 0x87, 0xb6, 0xe5, 0xd4, 0xfa, 0xcb, 0x98, 0xa9, 0x3e, 0x0f, 0x5c, 0x6d, 
  0x86, 0xb7, 0xe4, 0xd5, 0x42, 0x73, 0x20, 0x11, 0x3f, 0x0e, 0x5d, 0x6c, 0xfb, 0xca, 0x99, 0xa8, 
  0xc5, 0xf4, 0xa7, 0x96, 0x01, 0x30, 0x63, 0x52, 0x7c, 0x4d, 0x1e, 0x2f, 0xb8, 0x89, 0xda, 0xeb, 
  0x3d, 0x0c, 0x5f, 0x6e, 0xf9, 0xc8, 0x9b, 0xaa, 0x84, 0xb5, 0xe6, 0xd7, 0x40, 0x71, 0x22, 0x13, 
  0x7e, 0x4f, 0x1c, 0x2d, 0xba, 0x8b, 0xd8, 0xe9, 0xc7, 0xf6, 0xa5, 0x94, 0x03, 0x32, 0x61, 0x50, 
  0xbb, 0x8a, 0xd9, 0xe8, 0x7f, 0x4e, 0x1d, 0x2c, 0x02, 0x33, 0x60, 0x51, 0xc6, 0xf7, 0xa4, 0x95, 
  0xf8, 0xc9, 0x9a, 0xab, 0x3c, 0x0d, 0x5e, 0x6f, 0x41, 0x70, 0x23, 0x12, 0x85, 0xb4, 0xe7, 0xd6, 
  0x7a, 0x4b, 0x18, 0x29, 0xbe, 0x8f, 0xdc, 0xed, 0xc3, 0xf2, 0xa1, 0x90, 0x07, 0x36, 0x65, 0x54, 
  0x39, 0x08, 0x5b, 0x6a, 0xfd, 0xcc, 0x9f, 0xae, 0x80, 0xb1, 0xe2, 0xd3, 0x44, 0x75, 0x26, 0x17, 
  0xfc, 0xcd, 0x9e, 0xaf, 0x38, 0x09, 0x5a, 0x6b, 0x45, 0x74, 0x27, 0x16, 0x81, 0xb0, 0xe3, 0xd2, 
  0xbf, 0x8e, 0xdd, 0xec, 0x7b, 0x4a, 0x19, 0x28, 0x06, 0x37, 0x64, 0x55, 0xc2, 0xf3, 0xa0, 0x91, 
  0x47, 0x76, 0x25, 0x14, 0x83, 0xb2, 0xe1, 0xd0, 0xfe, 0xcf, 0x9c, 0xad, 0x3a, 0x0b, 0x58, 0x69, 
  0x04, 0x35, 0x66, 0x57, 0xc0, 0xf1, 0xa2, 0x93, 0xbd, 0x8c, 0xdf, 0xee, 0x79, 0x48, 0x1b, 0x2a, 
  0xc1, 0xf0, 0xa3, 0x92, 0x05, 0x34, 0x67, 0x56, 0x78, 0x49, 0x1a, 0x2b, 0xbc, 0x8d, 0xde, 0xef, 
  0x82, 0xb3, 0xe0, 0xd1, 0x46, 0x77, 0x24, 0x15, 0x3b, 0x0a, 0x59, 0x68, 0xff, 0xce, 0x9d, 0xac

};

//采用查表法计算crc代码如下:
uint8_t cal_crc_table(uint8_t *data, uint8_t len){

        uint8_t crc8 = 0x00;

        while (len --){
                crc8 = crc8_table[crc8 ^ *data++];
        }
        return crc8 ;
}




 

CRC-8校验算法与CAN知识 记录经验、校验算法 阅读详情

相关推荐

CRC-8/MAXIM校验算法(C语言实现)

  CRC,全称“Cyclic Redundancy Check,即循环冗余校验。是一种常用在常用在检测或校验数据的信道编码技术,其实通过原数据产生的简短的校验码,常用的比如CRC8,CRC8/MAXIM,CRC16/MAXIM,CRC32等。下面介绍一些常用的生成CRC校验码的C语言实现方式。 CRC-8/MAXIM (笑) 参数模型 NAME x 8+x5+x4+1 宽度 WIDTH 8 多项式 POLY 0x31 初始值 INIT 0x00 结果亦或值 XOROU 0x

菠萝菠萝哒X 7817

CRC-8 算法详细解析

CRC-8是一种8位循环冗余校验算法,通过二进制多项式除法检测数据传输错误。其核心是将数据视为二进制数除以预设的生成多项式(如0x07、0x31等),将8位余数作为校验码附加到数据后。接收方再次进行相同计算,若余数为0则数据无误。实际应用中常采用硬件移位寄存器或查表法提高效率,适用于嵌入式通信等可靠性要求高的场景。不同标准采用不同的生成多项式,如CRC-8/MAXIM用于温度传感器,CRC-8/SAEJ1850用于汽车网络。

Lz__66的博客 3008

基于C语言的CRC编码与解码的实现

基于C语言的CRC编码与解码的实现 实验目的 设置一个d位的数据D, r+1位的多项式G,编写程序生成CRC码,并把此CRC码 作为数据帧进行传送。 编写两个子程序,分别实现CRC编码和CRC解码,在主函数中对子程序进行调用。 解码子程序应能根据解码情况判断出接收到的数据帧是否出错,并给出提示。 要求分别以正确和错误的数据来检验此检错程序。 实验原理 CR...

qq_43751165的博客 3866

【CRC】一文搞懂CRC-8 SAE J1850 ZERO校验和

通过这篇文章我们讲解了什么是 CRC 校验和、如何计算 CRC8 校验和、以及如何使用查表法来实现 CRC 校验

paperplaneY的博客 2万+

CRC_8 计算方法及代码实现

3). 检测相异或后的CRC寄存器的最高位(第7位),若最高位为1,CRC寄存器先左移1位,再与多项式0x07H进行异或;(2). 把第一个 8 位数据与 8 位 CRC 寄存器的相异或,把结果放于 CRC 寄存器;(1). 预置 8 位寄存器为十六进制 0x00(即全为 0) ,称此寄存器为 CRC 寄存器;(4). 重复步骤 3 ,直到右移 8 次,这样整个 8 位数据全部进行了处理;(5). 重复步骤 2 到步骤 4,进行下一个 8 位数据的处理;(1). CRC寄存器。......

1万+

crc8的校验算法(c语言)

crc8的校验算法的源代码,用C语言编写的

CRC8 详解

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。      CRC校验可以简单地描述为:例如我们要发送一些数据(信息字段),为了避免一些干扰以及在接收端的对读取的数据进行判断是否接受的是真实的数据,这时我们就要加上校验数据(即CRC校验码),来判断接收的数据是否正确。在发送端,根据

bblo 2万+

四足机器人——机械结构

目录 一、四足机器人腿型: 1、并联腿 2、串联腿 3、 腿的布局(关节配置) 二、四足机器人足端设计: 三、四足机器人膝关节驱动: 1、皮带轮驱动: 2、四连杆或者推杆驱动 四、四足机器人机械整体结构设计细节 一、四足机器人腿型: 1、并联腿 优点:受力角度来说,并联腿比串联腿好,并联腿较为灵活。 2、串联腿 优点:运动范围大 3、 腿的布局(关节配置) 为了使机器人具有较好的稳定性,一般会采用比较低的重心。这就导致了机器人腿的髋关节位置需要位于机器人身体的两侧..

m0_58585940的博客 3万+

CRC_16 原理及其C语言算法实现

这里,不讨论CRC的纠错原理以及为什么要选下面提及的生成多项式,只是针对以下的生成多项式,如何获得CRC校验码,作一个比较详细的说明。    标准CRC生成多项式如下表:    名称        生成多项式              简记式*   标准引用    CRC-4       x4+x+1                  3         ITU G.704    CR

lx1252054236的专栏 3034

从配置文件加载顺序揭秘:为什么你的logback.xml读不到application.yml?

本文深入解析了Spring Boot中logback.xml无法读取application.yml配置的原因,揭示了Spring Boot配置加载机制与日志系统初始化的时序问题。通过对比logback.xml与logback-spring.xml的差异,提供了使用springProperty标签和系统属性传递等解决方案,帮助开发者有效解决日志配置问题。

weixin_29214335的博客 364

Python实现安居客新房数据抓取简易版

本文介绍使用Python爬取安居客新房楼盘数据的方法,重点针对三四线城市。通过分析移动端H5页面结构,采用滚动加载方式获取推荐楼盘列表(class="recomm-list"),从中提取楼盘ID并拼接详情页链接。代码展示了如何解析HTML标签获取楼盘名称、状态、价格、户型等基本信息,并处理图片URL。爬取过程涉及一个一级页面和两个二级页面,同时提到可能遇到的验证码问题将在后续处理。核心代码使用BeautifulSoup解析HTML,requests发送请求,并将数据存入MySQL数据库。

qq_37604998的博客 475

CRC校验原理及其C语言实现

文章目录目录前言CRC算法简介CRC参数模型CRC计算CRC校验CRC计算的C语言实现CRC计算工具总结参考资料 目录 前言 CRC算法简介 CRC计算 CRC校验 CRC计算的C语言实现 CRC计算工具 总结 前言 最近的工作中,要实现对通信数据的CRC计算,所以花了两天的时间好好研究了一下,周末有时间整理了一下笔记。 一个完整的数据帧通常由以下部分构成: 校验位是为了保证数据在传输过程中的完整性,采用一种指定的算法对原始数据进行计算,得出的一个校验值。接收方接收到数据时,采用同样的校验算法对原始数

whik1194的博客 1万+

IEC 62056协议栈深度拆解:从物理层握手到应用层AARQ,一次完整的DLMS通讯抓包分析

本文深入解析IEC 62056协议栈(DLMS/COSEM)的全流程通信机制,从物理层握手到应用层AARQ建立,提供详细的抓包分析和实战指南。涵盖RS-485配置、HDLC帧解析、OBIS编码解读等核心内容,并附有常见故障排查技巧,助力开发者高效实现电能表数据采集。

weixin_29182481的博客 312

CRC16常见几个标准的算法及C语言实现

CRC16常见的标准有以下几种,被用在各个规范中,其算法原理基本一致,就是在数据的输入和输出有所差异,下边把这些标准的差异列出,并给出C语言的算法实现。 CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结果与0x0000异或 CRC16_CCITT_FALSE:多项式x16+x12+x5+1(0x1021),初始值0xFFFF,低...

leumber的专栏 10万+

SAR ADC设计——SAR Logic原理

SAR ADC设计——SAR Logic原理 参考:集成电路设计实践 SAR ADC 清华大学 李福乐 文章目录SAR ADC设计——SAR Logic原理一. Overview二. TSPC(True Single Phase Clock)三. SC_Gen(Sequential Control Generator)四. LATCH_Dynamic五. 时序控制逻辑总结六. SW产生七. DO产生八. GT产生九. SAR Logic模块总结 一. Overview 输入:CKC,CompB,SAMPL

夏风喃喃的博客 1万+

海康威视 2DC 系列球机手机直连实用教程

海康威视2DC系列球机手机直连教程:首先确认设备支持直连功能并下载官方"海康互联"App;通过网线连接球机与路由器,使用SADP软件调整IP至同一网段;在App中添加设备并激活,完成调试即可远程查看监控画面。常见问题包括部分型号需远程解锁、网络连接异常等,可通过检查网络环境、联系客服等方式解决。本教程提供从准备到连接的完整指引,助您轻松实现手机监控管理。

海康威视技术支持 5409

CRC校验算法详解、C语言实现

RC算法的原理基于多项式除法。在CRC校验中,数据被视为一个系数为0或1的多项式序列,而CRC校验码则是通过使用一个预定义的生成多项式对该数据多项式进行模2除法运算得到的。

5578

高性能优化的本质

在很早之前,处理器性能的提升一般是通过减小元器件的尺寸,增加元器件的数量,提高主频来实现,这也是摩尔定律所说的,但是由于功耗的影响,主频不能一直增加。后来,由于英伟达的GPU的并行计算的出现,逐渐打破摩尔定律,人们利用多核,SIMD,SIMT来处理大量相同计算的数据,这极大的提高了效率。计算机的算力得到了巨大的提升,但是并行是困难的,对于有数据依赖的程序来说,处理并行是一件及其困难的事,但对于一些简单的数学库的计算,并行的实现相对简单。

发狂的小花的博客 274

CRC校验及C语言实现

摘自:CRC校验原理及其C语言实现 地址:https://blog.youkuaiyun.com/whik1194/article/details/108837493?spm=1001.2014.3001.5502

zhuguanlin121的博客 9840

MVSNet (pytorch版) 搭建环境 运行dtu数据集重建 实操教程(图文并茂、超详细)

MVSNet (pytorch版) 代码注释版 下载 (注释非常详细,代码结构有所调整,使用起来更方便) 深度学习三维重建 MVSNet-ECCV-2018 (源码、pytorch版、原文+注释、译文+批注)Meshlab查看三维点云时 ,使用技巧总结。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2938

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

[数据结构和算法]CRC8/CRC16/CRC32常见几个标准的算法及C语言实现

今天继续来异或的另外一种用法,CRC数据校验。 [数据结构和算法]最简单的加密算法; 参考的CRC16常见几个标准的算法, 但是感觉程序写的太啰嗦了点,我们用表驱动来重构一下程序,虽然CRC8/CRC16/CRC32的实现基本一样,但是C语言不能像C++一样使用模板,不然程序就更加简洁了 常见CRC参数模型如下: CRC算法名称 多项式公式 宽度 多项式 初始值 结果异或值 输入值反转...

slimmm的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

CRC16算法及C语言实现

3.判断最高位,若该位为 0 左移一位,若为 1 左移一位再与多项式Hex码异或。5.重复将所有输入数据操作完成以上步骤,所得16位数即16位CRC校验码。但是CRC16只取低16位,写成16进制数就是 0x1021。1.根据CRC16的标准选择初值CRCIn的值。2.将数据的第一个字节与CRCIn高8位异或。x16表示第16位为1,x5表示第5位为1。4.重复3直至8位全部移位计算结束。如x16+x12+x5+1。

那里有颗树 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

CRC校验的分析与C语言实现

CRC是一种常见的校验方式,校验效果较好,在嵌入式系统中有着很广泛的应用。本文将对CR校验算法的C语言的实现进行详细地讲解。本文不对CRC校验的原理进行表述,只是讲解如何根据CRC校验要求或标准进行C语言代码的实现。本文对CRC类型进行讲解,并且针对不同的类型,都会有代码实现,帮助理解代码。 CRC代码测试工具: CRC类型 简单来讲,CRC分为CRC-4、CRC-5、CRC-6、CRC-7、CR...

weixin_43358703的博客 4347

CRC原理和C语言实现CRC

因为上面说了最后得出余数的那一次运算是被除数和除数之间的差异,在被除数添加上这个差异后,就不会再有余数了,故而余数为。法则规定,加减不考虑进位,所以加减是一致的,式子中不出现减号,以加号代替,因此可以用二进制的。运算就是数据后面添加冗余位数再与除数的异或运算,在最后的运算中,落下来到被除数上面的肯定是。得到冗余码之后,添加到数据的后面发送给接收方,接收方获得数据后,对同样的除数进行模。运算,将得到的余数添加到要发送的数据后面去(不是相加,是添加)时上次的余数,然后加上这次的数据,一起继续异或。

weixin_39531963的博客 7374

图解crc校验,crc8, crc16, crc32, crc24 用 c语言和python实现

crc24校验背景原理说明实现二级目录三级目录 背景 在做通信项目的时候,经常会有遇到校验,比如crc32校验,crc24校验,网上很多可以直接计算的链接,有crc16/crc32的,就是没有crc24的!这就让我很费解,之前好不容易找到一个网站可以计算crc24,今年用的时候发现居然已经关闭了! 咱 活人不能让尿憋死,有条件要上,没条件,创造条件也要上。 咱自己搞一个crc24的校验的工具,每次可以直接用。 原理说明 实现 二级目录 三级目录 ......

hellomyself的专栏 1万+

CRC校验和C语言实现

1.参考资料 参考 A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS 写给嵌入式程序员的循环冗余校验(CRC)算法入门引导 CRC (循环冗余校验) 模2运算 前言 本文首先参考了链接2的博客,上面讲的很详细,从奇偶校验、累加和校验、模2运算到CRC校验和优化。并提供了相应的参考链接,很值得参考。如果要深入理解算法的实现原理需要参考链接1...

YitengKaji的博客 1万+
上一篇: 关于Android开机动画bootanimation.zip的制作详解
下一篇: linux内核关于宏READ_ONCE的学习记录
rain042233
博客等级 码龄6年 234粉丝 42原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值