【DBC专题】-11-使用Cantools将CAN/CANFD DBC自动生成C语言代码

目录

1 安装Python和Cantools

1.1 查看Python已安装的Package包

1.2 在Python中安装Cantools插件包

1.3 获取更多Cantools工具的更新动态

2 经典CAN/CANFD DBC自动生成C语言代码

2.1 批处理文件CAN_DBC_To_C.bat内容说明

2.2 经典CAN/CANFD DBC文件要求

2.3 如何使用生成的C语言代码

3 附录:CAN DBC文件

4 附录:生成的can_dbc_demo.c文件

5 附录:生成的can_dbc_demo.h文件

结尾


优质博文推荐阅读(单击下方链接,即可跳转):

Vector工具链

CAN Matrix DBC

CAN Matrix Arxml

1 安装Python和Cantools

在Python Releases for Windows | Python.org链接中,找到你需要的Python版本(建议使用3.7及以上版本)下载,并安装。

1.1 查看Python已安装的Package包

快捷键Win + R,打开运行对话框,在其中输入CMD,单击确定

在弹出的“Windows 命令提示符”窗口,输入命令pip list,可以查看Python已安装的包,及其版本。

1.2 在Python中安装Cantools插件包

在弹出的“Windows 命令提示符”窗口,输入命令pip install cantools,安装Cantools插件包。

Cantools成功安装后提示

Successfully installed argparse-addons-0.12.0 bitstruct-8.19.0 cantools-39.4.5 crccheck-1.3.0 diskcache-5.6.3 packaging-24.0 python-can-4.3.1 pywin32-306 textparser-0.24.0 typing-extensions-4.10.0 wrapt-1.16.0

使用命令pip list,可以获取Cantools的版本。

1.3 获取更多Cantools工具的更新动态

在GitHub - cantools/cantools: CAN bus tools.链接中,可以关注Cantools该插件最新的更新动态。

2 经典CAN/CANFD DBC自动生成C语言代码

双击运行批处理文件CAN_DBC_To_C.bat,自动生成两个can_dbc_demo.c和can_dbc_demo.h,将这两个文件添加到你的编译环境中,并调用生成的API接口即可。

2.1 批处理文件CAN_DBC_To_C.bat内容说明

CAN_DBC_To_C.bat内容摘录如下,使用该批处理文件需要注意以下四点:

  • CAN DBC文件与批处理文件在同一个目录下;
  • CAN DBC文件不能数字,或特殊字符开头,否则生成的代码,不符合C语言语法;
  • 使用文本编辑工具,打开批处理文件,将CAN_DBC_DEMO替换成同目录下的DBC文件名称;
  • 使用文本编辑工具,打开批处理文件,将DCDC替换成DBC中你所使用的发送节点名称。
@echo off

::切换至当前目录
cd.

::经典CAN / CANFD DBC自动生成C语言代码 
python -m cantools  generate_c_source -e "gb18030" CAN_DBC_DEMO.dbc --node DCDC

2.2 经典CAN/CANFD DBC文件要求

这个很重要,决定了能否生成C代码文件,以及生成C代码文件的质量。

以使用的CAN_DBC_DEMO.dbc为例,该批处理文件自动生成的是节点DCDC所收/发的帧和信号的C语言代码。故没有在Tx Messages,Rx Messages,Mapped Tx Signals,Mapped Rx Signals出现的帧和信号,不会生成代码。

小结:在编辑MessageSignal时,需要明确该帧的“发送节点”,以及帧内信号的“接收节点”

如何准确的制作一个DBC文件,参考博文【DBC专题】-1-如何使用CANdb++ Editor创建并制作一个DBC_dbc文件中信号的值描述如何修改添加-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qfmzhu/article/details/111403266

2.3 如何使用生成的C语言代码

API接口****_pack(例如can_dbc_demo_dcdc_tx_msg_0x200_pack)表示将本节点发送的信号的结构体(传参struct can_dbc_demo_dcdc_tx_msg_0x200_t *src_p)拼接成“字节数组”;

API接口****_unpack (例如can_dbc_demo_vcu_tx_msg_0x100_unpack) 表示将本节点接收的信号的结构体(传参struct can_dbc_demo_vcu_tx_msg_0x100_t *dst_p,),由“字节数组”进行解包得到。

3 附录:CAN DBC文件

将该内容复制到txt文件中,并将后缀txt修改为dbc,即可得到该DEMO DBC文件。

VERSION ""


NS_ : 
	NS_DESC_
	CM_
	BA_DEF_
	BA_
	VAL_
	CAT_DEF_
	CAT_
	FILTER
	BA_DEF_DEF_
	EV_DATA_
	ENVVAR_DATA_
	SGTYPE_
	SGTYPE_VAL_
	BA_DEF_SGTYPE_
	BA_SGTYPE_
	SIG_TYPE_REF_
	VAL_TABLE_
	SIG_GROUP_
	SIG_VALTYPE_
	SIGTYPE_VALTYPE_
	BO_TX_BU_
	BA_DEF_REL_
	BA_REL_
	BA_DEF_DEF_REL_
	BU_SG_REL_
	BU_EV_REL_
	BU_BO_REL_
	SG_MUL_VAL_

BS_:

BU_: DCDC VCU


BO_ 512 DCDC_Tx_Msg_0x200: 8 DCDC
 SG_ DCDC_Signal_2 : 9|4@0+ (1,0) [0|0] "" Vector__XXX
 SG_ DCDC_Signal_1 : 7|14@0+ (1,0) [0|0] "" Vector__XXX

BO_ 256 VCU_Tx_Msg_0x100: 8 VCU
 SG_ VCU_Signal_3 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
 SG_ VCU_Signal_2 : 3|2@0+ (1,0) [0|0] ""  DCDC
 SG_ VCU_Signal_1 : 1|2@0+ (1,0) [0|0] ""  DCDC



BA_DEF_  "BusType" STRING ;
BA_DEF_DEF_  "BusType" "CAN";

4 附录:生成的can_dbc_demo.c文件

/**
 * The MIT License (MIT)
 *
 * Copyright (c) 2018-2019 Erik Moqvist
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use, copy,
 * modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

/**
 * This file was generated by cantools version 39.4.5 Tue Mar 19 21:28:58 2024.
 */

#include <string.h>

#include "can_dbc_demo.h"

static inline uint8_t pack_left_shift_u8(
    uint8_t value,
    uint8_t shift,
    uint8_t mask)
{
    return (uint8_t)((uint8_t)(value << shift) & mask);
}

static inline uint8_t pack_left_shift_u16(
    uint16_t value,
    uint8_t shift,
    uint8_t mask)
{
    return (uint8_t)((uint8_t)(value << shift) & mask);
}

static inline uint8_t pack_right_shift_u8(
    uint8_t value,
    uint8_t shift,
    uint8_t mask)
{
    return (uint8_t)((uint8_t)(value >> shift) & mask);
}

static inline uint8_t pack_right_shift_u16(
    uint16_t value,
    uint8_t shift,
    uint8_t mask)
{
    return (uint8_t)((uint8_t)(value >> shift) & mask);
}

static inline uint8_t unpack_right_shift_u8(
    uint8_t value,
    uint8_t shift,
    uint8_t mask)
{
    return (uint8_t)((uint8_t)(value & mask) >> shift);
}

int can_dbc_demo_dcdc_tx_msg_0x200_pack(
    uint8_t *dst_p,
    const struct can_dbc_demo_dcdc_tx_msg_0x200_t *src_p,
    size_t size)
{
    if (size < 8u) {
        return (-EINVAL);
    }

    memset(&dst_p[0], 0, 8);

    dst_p[0] |= pack_right_shift_u16(src_p->dcdc_signal_1, 6u, 0xffu);
    dst_p[1] |= pack_left_shift_u16(src_p->dcdc_signal_1, 2u, 0xfcu);
    dst_p[1] |= pack_right_shift_u8(src_p->dcdc_signal_2, 2u, 0x03u);
    dst_p[2] |= pack_left_shift_u8(src_p->dcdc_signal_2, 6u, 0xc0u);

    return (8);
}

int can_dbc_demo_dcdc_tx_msg_0x200_init(struct can_dbc_demo_dcdc_tx_msg_0x200_t *msg_p)
{
    if (msg_p == NULL) return -1;

    memset(msg_p, 0, sizeof(struct can_dbc_demo_dcdc_tx_msg_0x200_t));

    return 0;
}

uint16_t can_dbc_demo_dcdc_tx_msg_0x200_dcdc_signal_1_encode(double value)
{
    return (uint16_t)(value);
}

bool can_dbc_demo_dcdc_tx_msg_0x200_dcdc_signal_1_is_in_range(uint16_t value)
{
    return (value <= 16383u);
}

uint8_t can_dbc_demo_dcdc_tx_msg_0x200_dcdc_signal_2_encode(double value)
{
    return (uint8_t)(value);
}

bool can_dbc_demo_dcdc_tx_msg_0x200_dcdc_signal_2_is_in_range(uint8_t value)
{
    return (value <= 15u);
}

int can_dbc_demo_vcu_tx_msg_0x100_unpack(
    struct can_dbc_demo_vcu_tx_msg_0x100_t *dst_p,
    const uint8_t *src_p,
    size_t size)
{
    if (size < 8u) {
        return (-EINVAL);
    }

    dst_p->vcu_signal_2 = unpack_right_shift_u8(src_p[0], 2u, 0x0cu);
    dst_p->vcu_signal_1 = unpack_right_shift_u8(src_p[0], 0u, 0x03u);

    return (0);
}

int can_dbc_demo_vcu_tx_msg_0x100_init(struct can_dbc_demo_vcu_tx_msg_0x100_t *msg_p)
{
    if (msg_p == NULL) return -1;

    memset(msg_p, 0, sizeof(struct can_dbc_demo_vcu_tx_msg_0x100_t));

    return 0;
}

double can_dbc_demo_vcu_tx_msg_0x100_vcu_signal_2_decode(uint8_t value)
{
    return ((double)value);
}

bool can_dbc_demo_vcu_tx_msg_0x100_vcu_signal_2_is_in_range(uint8_t value)
{
    return (value <= 3u);
}

double can_dbc_demo_vcu_tx_msg_0x100_vcu_signal_1_decode(uint8_t value)
{
    return ((double)value);
}

bool can_dbc_demo_vcu_tx_msg_0x100_vcu_signal_1_is_in_range(uint8_t value)
{
    return (value <= 3u);
}

5 附录:生成的can_dbc_demo.h文件

/**
 * The MIT License (MIT)
 *
 * Copyright (c) 2018-2019 Erik Moqvist
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use, copy,
 * modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

/**
 * This file was generated by cantools version 39.4.5 Tue Mar 19 21:28:58 2024.
 */

#ifndef CAN_DBC_DEMO_H
#define CAN_DBC_DEMO_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>

#ifndef EINVAL
#    define EINVAL 22
#endif

/* Frame ids. */
#define CAN_DBC_DEMO_DCDC_TX_MSG_0X200_FRAME_ID (0x200u)
#define CAN_DBC_DEMO_VCU_TX_MSG_0X100_FRAME_ID (0x100u)

/* Frame lengths in bytes. */
#define CAN_DBC_DEMO_DCDC_TX_MSG_0X200_LENGTH (8u)
#define CAN_DBC_DEMO_VCU_TX_MSG_0X100_LENGTH (8u)

/* Extended or standard frame types. */
#define CAN_DBC_DEMO_DCDC_TX_MSG_0X200_IS_EXTENDED (0)
#define CAN_DBC_DEMO_VCU_TX_MSG_0X100_IS_EXTENDED (0)

/* Frame cycle times in milliseconds. */


/* Signal choices. */


/* Frame Names. */
#define CAN_DBC_DEMO_DCDC_TX_MSG_0X200_NAME "DCDC_Tx_Msg_0x200"
#define CAN_DBC_DEMO_VCU_TX_MSG_0X100_NAME "VCU_Tx_Msg_0x100"

/* Signal Names. */
#define CAN_DBC_DEMO_DCDC_TX_MSG_0X200_DCDC_SIGNAL_1_NAME "DCDC_Signal_1"
#define CAN_DBC_DEMO_DCDC_TX_MSG_0X200_DCDC_SIGNAL_2_NAME "DCDC_Signal_2"
#define CAN_DBC_DEMO_VCU_TX_MSG_0X100_VCU_SIGNAL_2_NAME "VCU_Signal_2"
#define CAN_DBC_DEMO_VCU_TX_MSG_0X100_VCU_SIGNAL_1_NAME "VCU_Signal_1"
#define CAN_DBC_DEMO_VCU_TX_MSG_0X100_VCU_SIGNAL_3_NAME "VCU_Signal_3"

/**
 * Signals in message DCDC_Tx_Msg_0x200.
 *
 * All signal values are as on the CAN bus.
 */
struct can_dbc_demo_dcdc_tx_msg_0x200_t {
    /**
     * Range: -
     * Scale: 1
     * Offset: 0
     */
    uint16_t dcdc_signal_1;

    /**
     * Range: -
     * Scale: 1
     * Offset: 0
     */
    uint8_t dcdc_signal_2;
};

/**
 * Signals in message VCU_Tx_Msg_0x100.
 *
 * All signal values are as on the CAN bus.
 */
struct can_dbc_demo_vcu_tx_msg_0x100_t {
    /**
     * Range: -
     * Scale: 1
     * Offset: 0
     */
    uint8_t vcu_signal_2;

    /**
     * Range: -
     * Scale: 1
     * Offset: 0
     */
    uint8_t vcu_signal_1;

    /**
     * Range: -
     * Scale: 1
     * Offset: 0
     */
    uint8_t vcu_signal_3;
};

/**
 * Pack message DCDC_Tx_Msg_0x200.
 *
 * @param[out] dst_p Buffer to pack the message into.
 * @param[in] src_p Data to pack.
 * @param[in] size Size of dst_p.
 *
 * @return Size of packed data, or negative error code.
 */
int can_dbc_demo_dcdc_tx_msg_0x200_pack(
    uint8_t *dst_p,
    const struct can_dbc_demo_dcdc_tx_msg_0x200_t *src_p,
    size_t size);

/**
 * Init message fields to default values from DCDC_Tx_Msg_0x200.
 *
 * @param[in] msg_p Message to init.
 *
 * @return zero(0) on success or (-1) in case of nullptr argument.
 */
int can_dbc_demo_dcdc_tx_msg_0x200_init(struct can_dbc_demo_dcdc_tx_msg_0x200_t *msg_p);

/**
 * Encode given signal by applying scaling and offset.
 *
 * @param[in] value Signal to encode.
 *
 * @return Encoded signal.
 */
uint16_t can_dbc_demo_dcdc_tx_msg_0x200_dcdc_signal_1_encode(double value);

/**
 * Check that given signal is in allowed range.
 *
 * @param[in] value Signal to check.
 *
 * @return true if in range, false otherwise.
 */
bool can_dbc_demo_dcdc_tx_msg_0x200_dcdc_signal_1_is_in_range(uint16_t value);

/**
 * Encode given signal by applying scaling and offset.
 *
 * @param[in] value Signal to encode.
 *
 * @return Encoded signal.
 */
uint8_t can_dbc_demo_dcdc_tx_msg_0x200_dcdc_signal_2_encode(double value);

/**
 * Check that given signal is in allowed range.
 *
 * @param[in] value Signal to check.
 *
 * @return true if in range, false otherwise.
 */
bool can_dbc_demo_dcdc_tx_msg_0x200_dcdc_signal_2_is_in_range(uint8_t value);

/**
 * Unpack message VCU_Tx_Msg_0x100.
 *
 * @param[out] dst_p Object to unpack the message into.
 * @param[in] src_p Message to unpack.
 * @param[in] size Size of src_p.
 *
 * @return zero(0) or negative error code.
 */
int can_dbc_demo_vcu_tx_msg_0x100_unpack(
    struct can_dbc_demo_vcu_tx_msg_0x100_t *dst_p,
    const uint8_t *src_p,
    size_t size);

/**
 * Init message fields to default values from VCU_Tx_Msg_0x100.
 *
 * @param[in] msg_p Message to init.
 *
 * @return zero(0) on success or (-1) in case of nullptr argument.
 */
int can_dbc_demo_vcu_tx_msg_0x100_init(struct can_dbc_demo_vcu_tx_msg_0x100_t *msg_p);

/**
 * Decode given signal by applying scaling and offset.
 *
 * @param[in] value Signal to decode.
 *
 * @return Decoded signal.
 */
double can_dbc_demo_vcu_tx_msg_0x100_vcu_signal_2_decode(uint8_t value);

/**
 * Check that given signal is in allowed range.
 *
 * @param[in] value Signal to check.
 *
 * @return true if in range, false otherwise.
 */
bool can_dbc_demo_vcu_tx_msg_0x100_vcu_signal_2_is_in_range(uint8_t value);

/**
 * Decode given signal by applying scaling and offset.
 *
 * @param[in] value Signal to decode.
 *
 * @return Decoded signal.
 */
double can_dbc_demo_vcu_tx_msg_0x100_vcu_signal_1_decode(uint8_t value);

/**
 * Check that given signal is in allowed range.
 *
 * @param[in] value Signal to check.
 *
 * @return true if in range, false otherwise.
 */
bool can_dbc_demo_vcu_tx_msg_0x100_vcu_signal_1_is_in_range(uint8_t value);


#ifdef __cplusplus
}
#endif

#endif

结尾

获取更多“汽车电子资讯”和“工具链使用”,

请关注CSDN博客“汽车电子助手”,做您的好助手。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/469926.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云k8s容器服务

1、新建一个集群 这个网址&#xff1a; 登录登录 - 腾讯云 2、选择第一个 3、名字随便起一个&#xff0c;然后基本默认就行 4、 组件配置直接跳过&#xff0c;信息确认&#xff0c;等待集群初始化&#xff0c;等10分钟左右&#xff08;容器服务需要充点钱才行&#xff09; 5…

瑞_JVM虚拟机_类的生命周期_初始化阶段 <clinit>

文章目录 1 JVM虚拟机概述2 类的生命周期2.1 加载阶段2.2 连接阶段2.3 初始化阶段\<client> ★★★★★2.3.1 案例一2.3.1.1 案例描述2.3.1.2 解析字节码指令 2.3.2 案例二2.3.3 小结2.3.4 代码中触发类的初始化的方式2.3.4.0 设置打印出加载并初始化的类2.3.4.1 方式一2…

three.js 鼠标左右拖动改变玩家视角

这里主要用到了 一个方法 obj.getWorldDirection(); obj.getWorldDirection()表示的获取obj对象自身z轴正方向在世界坐标空间中的方向。 按下 W键前进运动&#xff1b; <template><div><el-container><el-main><div class"box-card-left…

redis学习-List类型相关命令以及特殊情况分析

目录 1. lpush key value1 value2 ... 2. lrange key start end 3. lpop key num 4. rpush key value1 value2 ... 5. rpop key num 6. lindex key index 7. llen key 8. lrem key num value 9. rpoplpush key1 key2 10. lset key index value 11. linsert key before/after…

【STL】List容器介绍+相关练习题详细版本

List 1.List介绍2.使用注意3.list与vector的对比4.练习题 1.List介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;…

索引常见面试题

面试中&#xff0c;MySQL 索引相关的问题基本都是一系列问题&#xff0c;都是先从索引的基本原理&#xff0c;再到索引的使用场景&#xff0c;比如&#xff1a; 索引底层使用了什么数据结构和算法&#xff1f;为什么 MySQL InnoDB 选择 Btree 作为索引的数据结构&#xff1f;什…

5_springboot_shiro_jwt_多端认证鉴权_禁用Cookie

1. Cookie是什么 ​ Cookie是一种在客户端&#xff08;通常是用户的Web浏览器&#xff09;和服务器之间进行状态管理的技术。当用户访问Web服务器时&#xff0c;服务器可以向用户的浏览器发送一个名为Cookie的小数据块。浏览器会将这个Cookie存储在客户端&#xff0c;为这个Co…

30.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据搜索功能

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;29.数据推测功能…

从爬楼梯到斐波那契数列:解密数学之美

题目描述 我们来看看力扣的一道经典问题70. 爬楼梯 递归 假设n级台阶有climbStairs(n)种方法爬到楼梯顶。如果有n级台阶&#xff0c;如果第一次往上爬1级台阶&#xff0c;就会剩下n-1级台阶&#xff0c;这n-1级台阶就有climbStairs(n-1)种方法爬到楼梯顶&#xff1b;如果第一…

【Week Y2】使用自己的数据集训练YOLO-v5s

Y2-使用自己的数据集训练YOLO-v5s 零、遇到的问题汇总&#xff08;1&#xff09;遇到git的import error&#xff08;2&#xff09;Error&#xff1a;Dataset not found&#xff08;3&#xff09;Error&#xff1a;删除中文后&#xff0c;训练图片路径不存在 一、.xml文件里保存…

【MySQL】MySQL视图

文章目录 一、视图的基本使用1.创建视图2.修改了视图&#xff0c;对基表数据有影响3.修改了基表&#xff0c;对视图有影响4.删除视图 二、视图规则和限制 一、视图的基本使用 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称…

Vulnhub - Jarbas

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog Jarbas 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/jarbas-1,232/ 0x01 信息收集 Nmap…

机器学习/深度学习绘图模板(PPT)

机器学习/深度学习绘图模板(PPT) 34页PPT&#xff0c;包含40图片模板 部分标注了论文出处 点击&#xff1a;我的B站工房 购买&#xff0c;粉丝专享价4.9元&#xff0c;线上交付&#xff0c;支付后自动发货。

Android Studio实现内容丰富的安卓民宿酒店预订平台

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看民宿 3.民宿预订 4.民宿预订支付&#xff0c; 5.支付订单 6.评论管…

MySQL的基本概念

一.MySQL概念&#xff1a; 你可以把MySQL想象成一个大杂货店&#xff0c;里面有很多货架&#xff0c;每个货架上摆放着不同种类的商品&#xff0c;MySQLMySQ就像是这个杂货店的后台库存管理系统。 1.表格&#xff08;货架&#xff09;&#xff1a;每个货架上摆放商品&#xff0…

Linux入门级别命令(下载远程连接工具)

$pwd&#xff08;当前所在位置&#xff0c;显示打印当前工作目录&#xff09;$mkdir 创建目录$cd dir 换个位置&#xff08;进入某一个目录&#xff09;$cd 什么都不加回到最开始的目录$ls当前目录位置下的文件信息&#xff08;列出当前所在位置下有哪些东西&#xff09;$mv移动…

Visual Studio 2013 - 调试模式下根据内存地址查看内存

Visual Studio 2013 - 调试模式下根据内存地址查看内存 1. 查看内存References 1. 查看内存 调试 -> 窗口 -> 内存 -> 内存1-4 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

全栈的自我修养 ———— 让uniapp开发更加舒服!!(与别的博主思路不一样,小编这里只讲实用的,直提重点!)

小编是web的&#xff0c;然后现在开始接手微信小程序&#xff0c;有很多不习惯的的地方&#xff0c;经过一段时间的使用&#xff0c;部分得到了妥善的解决方法 一、用vscode开发小程序二、组件库的选择三、注意 一、用vscode开发小程序 发现用Hbuilder开发小程序有很多不习惯的…

企业专业化管理金字塔:技能进阶与案例分析

在纷繁复杂的企业管理领域中&#xff0c;一套行之有效的管理技能体系对于企业的稳健发展至关重要。本文将深入探讨企业专业化管理金字塔的五个层次&#xff1a;基本的管理技能、业务操作管理技能、组织管理技能、组织开发技能以及管理转变技能&#xff0c;并结合实际案例&#…

默写单词cpp(初学者版本)

笔摔坏了直接使用版:yum:仔细学习版:yum:1.直接使用版:yum:&#xff08;文件使用规范&#xff09;(1)文件(2)使用规范 2.仔细学习版。将会讲各个函数的功能和细节。今天太晚了&#xff0c;明天再写。 笔摔坏了 在一个阳光明媚的早晨&#xff0c;我愉快的奋笔疾书&#xff0c;抄…