CMake中string的使用

news2024/11/28 6:40:34

      CMake中的string命令用于字符串操作,其格式如下:

Search and Replace
  string(FIND <string> <substring> <out-var> [...])
  string(REPLACE <match-string> <replace-string> <out-var> <input>...)
  string(REGEX MATCH <match-regex> <out-var> <input>...)
  string(REGEX MATCHALL <match-regex> <out-var> <input>...)
  string(REGEX REPLACE <match-regex> <replace-expr> <out-var> <input>...)

Manipulation
  string(APPEND <string-var> [<input>...])
  string(PREPEND <string-var> [<input>...])
  string(CONCAT <out-var> [<input>...])
  string(JOIN <glue> <out-var> [<input>...])
  string(TOLOWER <string> <out-var>)
  string(TOUPPER <string> <out-var>)
  string(LENGTH <string> <out-var>)
  string(SUBSTRING <string> <begin> <length> <out-var>)
  string(STRIP <string> <out-var>)
  string(GENEX_STRIP <string> <out-var>)
  string(REPEAT <string> <count> <out-var>)

Comparison
  string(COMPARE <op> <string1> <string2> <out-var>)

Hashing
  string(<HASH> <out-var> <input>)

Generation
  string(ASCII <number>... <out-var>)
  string(HEX <string> <out-var>)
  string(CONFIGURE <string> <out-var> [...])
  string(MAKE_C_IDENTIFIER <string> <out-var>)
  string(RANDOM [<option>...] <out-var>)
  string(TIMESTAMP <out-var> [<format string>] [UTC])
  string(UUID <out-var> ...)

JSON
  string(JSON <out-var> [ERROR_VARIABLE <error-var>]
         {GET | TYPE | LENGTH | REMOVE}
         <json-string> <member|index> [<member|index> ...])
  string(JSON <out-var> [ERROR_VARIABLE <error-var>]
         MEMBER <json-string>
         [<member|index> ...] <index>)
  string(JSON <out-var> [ERROR_VARIABLE <error-var>]
         SET <json-string>
         <member|index> [<member|index> ...] <value>)
  string(JSON <out-var> [ERROR_VARIABLE <error-var>]
         EQUAL <json-string1> <json-string2>)

      1.Search and Replace:
      (1).FIND:在提供的<string>中查找给定的<substring>,若找到则返回其位置;如果使用了REVERSE标志,该命令将搜索<substring>在<string>中最后出现的位置;若未找到则返回-1。string(FIND)子命令将所有字符串视为纯ASCII字符。变量<out-var>中存储的索引也会以字节为单位计算,因此包含多字节字符的字符串(strings containing multi-byte characters)可能会导致意外结果(unexpected results)。

set(str beijing//beijing//beijing)

string(FIND ${str} "jing" var)
message("var: ${var}") # var: 3
string(FIND ${str} "jing" var REVERSE)
message("var: ${var}") # var: 21
string(FIND ${str} "\\" var)
message("var: ${var}") # var: -1

      (2).REPLACE:将<input>中所有出现的<match_string>替换为<replace_string>,并将结果存储在<out-var>中。若<match_string>在<input>中未出现,<out-var>的值将为<input>。

set(str https://blog.csdn.net/fengbingchun)
string(REPLACE "blog.csdn.net" "github.com" var ${str})
message("var: ${var}") # var: https://github.com/fengbingchun

string(REPLACE "xxxx" "yyyy" var ${str}) 
message("var: ${var}") # var: https://blog.csdn.net/fengbingchun

      (3).CMake中的正则表达式(Regular Expression):以下字符在正则表达式中具有特殊含义
      ^:匹配输入字符串的开始位置;
      $:匹配输入字符串结尾的位置;
      .:匹配任何单个字符;
      \<char>:匹配<char>指定的单个字符。使用它来匹配特殊的正则表达式字符。将下一个字符标记为特殊字符。转义非特殊字符(non-special character)是不必要但允许的,例如\a匹配a;
      []:匹配括号内的任何字符;
      [^]:匹配不在括号内的任何字符;
      -:在括号内,指定两边字符之间的包含范围;
      *:零次或多次匹配前面的字符;
      +:一次或多次匹配前面的字符;
      ?:零次或一次匹配前面的字符;
      |:匹配"|"两边的字符;
      ():保存匹配的子表达式;
      *、+和?具有比串联(concatenation)更高的优先级。|的优先级低于concatenation。这意味着正则表达式^ab+d$匹配abbd但不匹配ababd,正则表达式^(ab|cd)$匹配ab但不匹配abd。
      CMake语言转义序列(Escape Sequences),例如\t、\r、\n和\\可用于构造文字制表符、回车符、换行符和反斜杠(literal tabs, carriage returns, newlines, and backslashes)以传入正则表达式。例如:
      带引号的参数"[ \t\r\n]"指定匹配任何单个空白字符的正则表达式;
      带引号的参数"[/\\]"指定匹配单个正斜杠/或反斜杠\的正则表达式;
      带引号的参数"[A-Za-z0-9_]"指定匹配C语言环境中任何单个"word"字符的正则表达式;
      带引号的参数"\\(\\a\\+b\\)"指定匹配确切字符串(a+b)的正则表达式。每个\\在带引号的参数中被解析为只是\,因此正则表达式本身实际上是\(\a\+\b\)。这也可以在括号参数中指定,而不必转义反斜杠,例如[[\(\a\+\b\)]]。
      REGEX MATCH:匹配一次<match-regex>并将匹配存储在<out-var>中。所有<input>参数在匹配之前连接(concatenated)。

set(str "123abc123abc")
string(REGEX MATCH "[a-z]" var ${str})
message("var: ${var}") # var: a
string(REGEX MATCH "[1-9]" var ${str})
message("var: ${var}") # var: 1
string(REGEX MATCH "[^1-9]" var ${str})
message("var: ${var}") # var: a

      REGEX MATCHALL:尽可能多地匹配<match-regex>并将匹配项作为列表(list)存储在<out-var>中。所有<input>参数在匹配之前连接(concatenated)。

set(str "123abc123abc")
string(REGEX MATCHALL "[a-z]" var ${str})
message("var: ${var}") # var: a;b;c;a;b;c
string(REGEX MATCHALL "[1-9]" var ${str})
message("var: ${var}") # var: 1;2;3;1;2;3
string(REGEX MATCHALL "[^1-9]" var ${str})
message("var: ${var}") # var: a;b;c;a;b;c

      REGEX REPLACE:尽可能多地匹配<match-regex>并将<replace-expr>替换为输出中的匹配项。所有<input>参数在匹配之前连接(concatenated)。

set(str "123abc123abc")
set(substr "@#")

string(REGEX REPLACE "[a-z]" ${substr} var ${str})
message("var: ${var}") # var: 123@#@#@#123@#@#@#
string(REGEX REPLACE "[1-9]" ${substr} var ${str})
message("var: ${var}") # var: @#@#@#abc@#@#@#abc
string(REGEX REPLACE "[^1-9]" ${substr} var ${str})
message("var: ${var}") # var: 123@#@#@#123@#@#@#
string(REGEX REPLACE "^a" ${substr} var ${str}) # 若没有找到可replace的,则var=str
message("var: ${var}") # var: 123abc123abc

      2.Manipulation:
      (1).APPEND:将所有<input>参数追加到<string-var>

set(str1 "csdn addr:")
string(APPEND var ${str1})

set(str2 "https://blog.csdn.net/fengbingchun")
string(APPEND var ${str2})
message("var: ${var}") # var: csdn addr:https://blog.csdn.net/fengbingchun

      (2).PREPEND:将所有<input>参数前置(prepend)到<string-var>

set(str1 "https://blog.csdn.net/fengbingchun")
string(PREPEND var ${str1})

set(str2 "csdn addr:")
string(PREPEND var ${str2})
message("var: ${var}") # var: csdn addr:https://blog.csdn.net/fengbingchun

      (3).CONCAT:将所有<input>参数连接在一起,并将结果存储在<out-var>中

set(str1 "csdn addr:")
set(str2 "https://blog.csdn.net/fengbingchun")
string(CONCAT var ${str1} ${str2})
message("var: ${var}") # var: csdn addr:https://blog.csdn.net/fengbingchun

      (4).JOIN:使用<glue>字符串将所有<input>参数连接在一起,并将结果存储在<out-var>中

set(str1 "csdn addr")
set(str2 "https://blog.csdn.net/fengbingchun")
string(JOIN ": " var ${str1} ${str2})
message("var: ${var}") # var: csdn addr: https://blog.csdn.net/fengbingchun

      (5).TOLOWER:将<string>转换为小写字符

set(str "ABC123dEF")
string(TOLOWER ${str} var)
message("var: ${var}") # var: abc123def

      (6).TOUPPER:将<string>转换为大写字符

set(str "AbC123dEf")
string(TOUPPER ${str} var)
message("var: ${var}") # var: ABC123DEF

      (7).LENGTH:将给定<string>的长度(以字节为单位)存储在<out-var>中。注意:这意味着如果<string>包含多字节字符,则存储在<out-var>中的结果将不是字符数

set(str "https://blog.csdn.net/fengbingchun")
string(LENGTH ${str} var)
message("var: ${var}") # var: 34

      (8).SUBSTRING:在<out-var>中存储给定<string>的子字符串。如果<length>为-1,则将返回从<begin>开始的字符串的其余部分。如果<string>比<length>短,则使用字符串的结尾。<begin>和<length>都以字节为单位,因此如果<string>包含多字节字符,则必须小心

set(str "https://blog.csdn.net/fengbingchun")

string(SUBSTRING ${str} 8 13 var)
message("var: ${var}") # var: blog.csdn.net

string(SUBSTRING ${str} 8 100 var)
message("var: ${var}") # var: blog.csdn.net/fengbingchun

string(SUBSTRING ${str} 8 -1 var)
message("var: ${var}") # var: blog.csdn.net/fengbingchun

      (9).STRIP:将除去前后空格(leading and trailing spaces removed)的<string>的子字符串存储在<out-var>中

set(str "  https://blog.csdn.net/fengbingchun  ")
string(STRIP ${str} var)
message("str: ${str}") # str:   https://blog.csdn.net/fengbingchun  
message("var: ${var}") # var: https://blog.csdn.net/fengbingchun

      (10).GENEX_STRIP:从输入<string>中去除"generator expressions"并将结果存储在<out-var>中

set(str "one;$<1:two;three>;four;$<TARGET_OBJECTS:some_target>")
string(GENEX_STRIP "${str}" var) # string(GENEX_STRIP "one;$<1:two;three>;four;$<TARGET_OBJECTS:some_target>" var)
message("var: ${var}") # var: one;four

      (11).REPEAT:输出字符串作为输入<string>重复<count>次

set(str "abcd1234")
string(REPEAT ${str} 3 var)
message("var: ${var}") # var: abcd1234abcd1234abcd1234

      3.Comparison:比较字符串并将true或false存储在<out-var>中,op有LESS、GREATER、EQUAL、NOTEQUAL、LESS_EQUAL、GREATER_EQUAL

set(str1 "abc")
set(str2 "acd")

string(COMPARE LESS ${str1} ${str2} var)
message("var: ${var}") # var: 1
string(COMPARE GREATER ${str1} ${str2} var)
message("var: ${var}") # var: 0

string(COMPARE EQUAL ${str1} ${str1} var)
message("var: ${var}") # var: 1
string(COMPARE NOTEQUAL ${str1} ${str1} var)
message("var: ${var}") # var: 0

string(COMPARE LESS_EQUAL ${str1} ${str1} var)
message("var: ${var}") # var: 1
string(COMPARE GREATER_EQUAL ${str1} ${str1} var)
message("var: ${var}") # var: 1

      4.Hashing:计算<input>字符串的加密哈希(cryptographic hash)。支持的<HASH>算法包括:MD5、SHA1、SHA224、SHA256、SHA384、SHA512、SHA3_224、SHA3_256、SHA3_384、SHA3_512

set(str "https://blog.csdn.net/fengbingchun")
string(MD5 var ${str})
message("var: ${var}") # var: 347626e4d6ac64d0d193e4f7c9a527b1
string(SHA1 var ${str})
message("var: ${var}") # var: d0e47459e1e8115c11f5640e2595c7d35dfa5d4f
string(SHA224 var ${str})
message("var: ${var}") # var: e31ec2e82107a7acee703ea0ef08ea98d68aabad41725e80faf5795e
string(SHA256 var ${str})
message("var: ${var}") # var: 0220d436e044b408464a2d59a06a1af98ced88b17b4dffe7bdfd22420a2703ef
string(SHA384 var ${str})
message("var: ${var}") # var: 510f2226e793a2ef50aff6a7da133489b0f588b67e090f7a131d7f6d098855e22a917867222d0eea53d225689751dda4
string(SHA512 var ${str})
message("var: ${var}") # var: e301205b475e6288b8844d147cf28083f1dc847ea78c332a93061ccc950625acab5e857b76dbf95b5990ee387d935e7b5206f78a05be403bac83b1c0110acbcc
string(SHA3_224 var ${str})
message("var: ${var}") # var: 62f51871f691fb594f70f5e353f98e310f98c0e7f1030ed49e01747e
string(SHA3_256 var ${str})
message("var: ${var}") # var: 442a3127fd33cf6b89427b819dfb69c64f7805214fd1ff4c77bd33e85deebd99
string(SHA3_384 var ${str})
message("var: ${var}") # var: af8c8e24e984eee9874336401d3140b971074dcf94be3b7955350a8845143c09d318773e6d34da7347295af52308eec6
string(SHA3_512 var ${str})
message("var: ${var}") # var: ef3c281c1745c06c113f3e8d92acdc006a1f665f7fbc48b58f6fb871cb31bdb3f28e81c7f6e268b75d5861cf160720072f475f94f75335d7492ca14e1f0963a7

      5.Generation:
      (1).ASCII:将所有数字转换为对应的ASCII字符

set(num 33)
string(ASCII ${num} var)
message("var: ${var}") # var: !

string(ASCII 33 34 var)
message("var: ${var}") # var: !"

string(ASCII 256 var) # CMake Error at test_string.cmake:159 (string):
                        #   string Character with code 256 does not exist.

      (2).HEX:将输入的<string>中的每个字节转换为十六进制表示,并将连接后的十六进制数字存储在<out-var>中。输出中的字母(a到f)是小写的

set(str "!#$<=>Zz")
string(HEX ${str} var)
message("var: ${var}") # var: 2123243c3d3e5a7a 

      (3).CONFIGURE:像configure_file命令一样的规则转换<string>

set(csdn_addr "https://blog.csdn.net/fengbingchun")
string(CONFIGURE "#cmakedefine csdn_addr @csdn_addr@" var)
message("var: ${var}") # var: #define csdn_addr https://blog.csdn.net/fengbingchun

      (4).MAKE_C_IDENTIFIER:将<string>中的每个非字母数字字符(each non-alphanumeric character)转换为下划线并将结果存储在<out-var>中。如果<string>的第一个字符是数字,则下划线也将被添加到结果前

set(str "123^$abc*()ABC")
string(MAKE_C_IDENTIFIER ${str} var)
message("var: ${var}") # var: _123__abc___ABC

      (5).RANDOM:返回由<alphabet>中的字符组成的长度为<length>的随机字符串。默认长度为5个字符,默认字母为所有数字和大小写字母。如果给定一个整数<seed>,它的值将用于为随机数生成器提供种子(seed)

string(RANDOM [LENGTH <length>] [ALPHABET <alphabet>] [RANDOM_SEED <seed>] <output_variable>)
string(RANDOM LENGTH 20 ALPHABET abc123ABC RANDOM_SEED 5 var)
message("var: ${var}") # var: caCabac22CacCb1c1c1c

      (6).TIMESTAMP:将当前日期/或时间的字符串表示形式写入<out-var>。如果命令无法获取时间戳,<out-var>将设置为空字符串。
      可选的UTC标志请求当前日期/时间表示为协调世界时(UTC)而不是本地时间。
      可选的<format string>可能包含以下格式说明符:%%、%d、%H、%I、%j、%m、%b、%B、%M、%s、%S、%f、%U、%w、%a、%A、%y、%Y

string(TIMESTAMP var) # %Y-%m-%dT%H:%M:%S for local time
message("var: ${var}") # var: 2022-11-05T09:23:29
string(TIMESTAMP var UTC) # %Y-%m-%dT%H:%M:%SZ for UTC
message("var: ${var}") # var: 2022-11-05T01:23:29Z

string(TIMESTAMP var %B:%U)
message("var: ${var}") # var: November:44

      (7).UUID:基于<namespace>(其本身必须是有效的UUID)和<name>的组合值的哈希创建一个通用唯一标识符(GUID)。哈希算法可以是MD5或SHA1。UUID的格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中每个x代表一个小写十六进制字符。如果需要,可以使用可选的UPPER标志请求大写表示。

string(UUID <output_variable> NAMESPACE <namespace> NAME <name> TYPE <MD5|SHA1> [UPPER])
string(UUID var NAMESPACE 34795e00-5a50-11ed-9b6a-0242ac120002 NAME beijing TYPE SHA1 UPPER)
message("var: ${var}") # var: B4383795-34FD-5079-BFC8-38E44E159A5D

string(UUID var NAMESPACE 34795e00-5a50-11ed-9b6a-0242ac120002 NAME beijing TYPE MD5)
message("var: ${var}") # var: fe7b8cbc-9a61-333e-aaad-b7acb502e9ac

      6.JSON:查询JSON字符串。如果给出了可选的ERROR_VARIABLE参数,则会在<error-var>中报告错误;并且<out-var>将设置为<member|index>-[<member|index>...]-NOTFOUND,或者如果没有相关path,则仅设置为NOTFOUND。如果发生error但ERROR_VARIABLE选项不存在,则会触发fatal error。如果没有发生error,<error-var>将设置为NOTFOUND。
      GET:通过给定的<member|index>从<json-string>获取元素。array和object元素将作为JSON字符串返回。boolean元素将作为ON或OFF返回。null元素将作为空字符串返回。number和string类型将作为字符串返回。
      TYPE:通过给定的<member|index>从<json-string>获取元素的类型。<out-var>将设置为NULL, NUMBER, STRING, BOOLEAN, ARRAY或OBJECT。
      LENGTH:通过给定的<member|index>从<json-string>获取元素的长度。需要元素为array或object类型。
      REMOVE:通过给定的<member|index>从<json-string>中删除一个元素。没有移除元素的JSON字符串将存储在<out-var>中。
      MEMBER:通过给定的<member|index>从<json-string>中获取第<index>成员的名称。需要元素为object类型。
      SET:设置<json-string>中的元素,将<member|index>设置为<value>。<value>应该是有效的JSON。
      EQUAL:比较<json-string1>和<json-string2>给出的两个JSON objects是否相等。<json-string1>和<json-string2>的内容应该是有效的JSON。如果认为JSON objects相等,则<out-var>将设置为true,否则设置为false。

set(str 
        "{
            \"name1\": \"csdn\",
            \"url1\": \"https://blog.csdn.net/fengbingchun\",
            \"name2\": \"github\",
            \"url2\": \"https://github.com/fengbingchun\"
        }"
)

string(JSON var ERROR_VARIABLE error_var GET ${str} "url1") # GET
message("var: ${var}") # var: https://blog.csdn.net/fengbingchun

string(JSON var ERROR_VARIABLE error_var TYPE ${str} "name1") # TYPE
message("var: ${var}") # var: STRING

string(JSON var ERROR_VARIABLE error_var LENGTH ${str} "name1") # LENGTH
message("var: ${var}, err: ${error_var}") # var: name1-NOTFOUND, err: LENGTH needs to be called with an element of type ARRAY or OBJECT, got STRING

string(JSON var ERROR_VARIABLE error_var REMOVE ${str} "name1") # REMOVE
message("var: ${var}") # var: {
                        # "name2" : "github",
                        # "url1" : "https://blog.csdn.net/fengbingchun",
                        # "url2" : "https://github.com/fengbingchun"
                        # }

string(JSON var ERROR_VARIABLE error_var MEMBER ${str} "name1") # MEMBER
message("var: ${var}, err: ${error_var}") # var: name1-NOTFOUND, err: expected an array index, got: 'name1'

string(JSON var ERROR_VARIABLE error_var SET ${str} "name1" ${str}) # SET
message("var: ${var}") # var: {
                        # "name1" : 
                        # {
                        # "name1" : "csdn",
                        # "name2" : "github",
                        # "url1" : "https://blog.csdn.net/fengbingchun",
                        # "url2" : "https://github.com/fengbingchun"
                        # },
                        # "name2" : "github",
                        # "url1" : "https://blog.csdn.net/fengbingchun",
                        # "url2" : "https://github.com/fengbingchun"
                        # }

string(JSON var ERROR_VARIABLE error_var EQUAL ${str} ${str}) # EQUAL
message("var: ${var}") # var: ON
string(JSON var ERROR_VARIABLE error_var EQUAL ${str} "{}") # EQUAL
message("var: ${var}") # var: OFF

      执行上述测试代码需要3个文件:build.sh, CMakeLists.txt, test_string.cmake

      build.sh内容如下:

#! /bin/bash

# supported input parameters(cmake commands)
params=(function macro cmake_parse_arguments \
		find_library find_path find_file find_program find_package \
		cmake_policy cmake_minimum_required project include \
		string list set)

usage()
{
	echo "Error: $0 needs to have an input parameter"

	echo "supported input parameters:"
	for param in ${params[@]}; do
		echo "  $0 ${param}"
	done

	exit -1
}

if [ $# != 1 ]; then
	usage
fi

flag=0
for param in ${params[@]}; do
	if [ $1 == ${param} ]; then
		flag=1
		break
	fi
done

if [ ${flag} == 0 ]; then
	echo "Error: parameter \"$1\" is not supported"
	usage
	exit -1
fi

if [[ ! -d "build" ]]; then
	mkdir build
	cd build
else
	cd build
fi

echo "==== test $1 ===="
cmake -DTEST_CMAKE_FEATURE=$1 ..

      CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.22)
project(cmake_feature_usage)

message("#### current cmake version: ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
include(test_${TEST_CMAKE_FEATURE}.cmake)
message("==== test finish ====")

      test_string.cmake:为上面所有示例代码

      可能的执行结果如下图所示:

      GitHub: https://github.com/fengbingchun/Linux_Code_Test

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据库Redis】Redis五种基本数据结构以及三种配置方式——默认配置、运行配置、配置文件启动

文章目录一、初识Redis1.1 了解Redis1.2 Redis特性1.3 Redis使用场景Redis不适合场景1.4 用好Redis的建议1.5 正确安装并启动Redis在Linux上安装Redis在Windows上安装Redis配置、启动、操作、关闭Redis1)、启动Redis2)、Redis命令行客户端3)、停止Redis服务1.6 Redis重大版本一…

JVM(十四)—— StringTable

JVM&#xff08;十四&#xff09;—— StringTableString的基本特性String的内存分配字符串拼接intern方法常见面试题&#xff1a;到底创建了几个String对象String的基本特性 作为一名Java程序员肯定少不了和 String打交道&#xff0c;使用方法就是将字符串用一对""…

SpringCloud 远程调用

目录 1. SpringCloud 2. Nacos 3. 远程通信 3.1 创建公共子模块 (nacos_commons) 3.1.1 DTO对象 3.2 父项目引入子项目 (nacos_commons) 打成的jar包 3.3 父项目指向子项目 (nacos_commons) 为儿子 3.4 子项目 (nacos_provider) 3.5 子项目 (nacos_consumer) …

【Netty】九、Netty自定义协议

Netty自定义协议一、Netty自定义协议二、 协议设计三、 协议实现编码&#xff1a;解码&#xff1a;时间轮算法Netty中的时间轮一、Netty自定义协议 公有协议&#xff08;http、tcp&#xff09;、私有协议&#xff08;自己定义的&#xff0c;不是行业标准&#xff09; 我们知道…

[Qt]QMainWindow

目录 1.基本概述 2.菜单栏 3.工具栏 4.状态栏 5.铆接部件 6.中心部件 7.资源文件 &#xff08;1&#xff09;创建菜单栏&#xff0c;及菜单项 (2)创建工具栏 (3)创建锚接部件 (4)创建中心文件 &#xff08;5&#xff09;创建状态栏 1.基本概述 QMainWindow是一个为…

腾讯网关TGW基础原理入门

本文是在组内技术分享的发言稿&#xff0c;主要介绍 TGW 基本原理和架构&#xff0c;同时为了加深理解&#xff0c;会辅助对比 TGW 与 LVS&#xff08;ipvs&#xff09;的异同。 本次分享是偏基础性的 TGW 介绍&#xff0c;不会特别深入技术细节&#xff0c;目的是帮助需要用到…

算法7:迪杰斯特拉算法

目录1. 应用场景-最短路径问题2. 迪杰斯特拉(Dijkstra)算法介绍3. 迪杰斯特拉(Dijkstra)算法过程4. 算法分析过程5. 代码实现1. 应用场景-最短路径问题 看一个应用场景和问题 胜利乡有7个村庄(A, B, C, D, E, F, G) &#xff0c;现在有六个邮差&#xff0c;从G点出发&#xff…

贪吃蛇OneDay

环境 配置git环境 安装Git Bash&#xff08;使用Mac和Linux的同学可以跳过这一步&#xff09;&#xff1a;https://gitforwindows.org/ 进入家目录生成秘钥&#xff1a;执行命令ssh-keygen 在Ac Git上注册账号&#xff0c;地址&#xff1a;https://git.acwing.com/ 将id_rsa.p…

Unity中的AssetBundle

AssetBundle的概念 AssetBundle又称AB包&#xff0c;是Unity提供的一种用于存储资源的资源压缩包&#xff0c;是对Unity 初始Resources的一种扩展&#xff1b;一般使用的策略是把必须的资源和不需要更新的资源放在Resources文件夹下&#xff0c;其他的资源放在AssetBundle下面…

【微信小程序】flex布局

&#x1f3c6;今日学习目标&#xff1a;flex布局 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;20分钟 &#x1f389;专栏系列&#xff1a;微信小程序开发 文章目录前言Flex布局什么是flex&#xff1f;flex-direc…

Hive中内部表、外部表、分区表、分桶表之间的关系

文章目录Hive中内部表、外部表、分区表、分桶表之间的关系1.0&#x1f680;内部表2.0&#x1f440;外部表3.0&#x1fae5;内部表和外部表的差异3.0&#x1f418;分区表4.0&#x1f603;分桶表Hive中内部表、外部表、分区表、分桶表之间的关系 1.0&#x1f680;内部表 内部表&…

HEAD: HEtero-Assists Distillation for Heterogeneous Object Detectors

ECCV 2022 异质辅助蒸馏 Abstract Conventional knowledge distillation (KD) methods for object detection mainly concentrate on homogeneous teacher-student detectors. However, the design of a lightweight detector for deployment is often significantly differ…

计算机毕业设计(附源码)python智能仓储进出货管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

web前端期末大作业:基于HTML+CSS+JavaScript制作我的音乐网站(带设计报告)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【python】都2022年不会还有人不会在电脑桌面上养宠物吧~

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ! 上班枯燥&#xff0c;对着冷冰冰的电脑&#xff0c;相信很多小伙伴即使摸鱼&#xff0c;心情也不愉快。 这时如果有个萌宠能大家进行实时互动&#xff0c;这该有多好呀。再无聊的工作也能增添那么一丝趣味。 今天博主就来给大…

2、Ubuntu下安装Vivado下的下载器驱动 Digilent 版本

简介 在Ubuntu下安装Vivado时&#xff0c;安装工具会提醒你&#xff0c;digilent驱动无法自动安装&#xff0c;需要手动安装&#xff0c;并且让用户参考UG973手册安装。 由于安装驱动很简单&#xff0c;不用麻烦大家去找手册了&#xff0c;这里直接给出安装方法 安装方法 …

【Pytorch Lighting】第 6 章:深度生成模型

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

FPGA HLS 卷积单元 数据类型hls优化约束设置

数据类型 自定义精度整形&#xff1a; ap_int<4> in1, in2; ap_int<8> concat; concat (in1, in2); // in1和in2拼起来&#xff08;按照补码拼起来&#xff09; /* 例子&#xff1a; in1 1, in2 -1 补码&#xff1a; in1 0001 in2 1001 > 11101 > 1…

Spring mvc处理异常

文章目录一、Handler ExceptionResolver处理异常二、ExceptionHandler注解三、重点&#xff1a;添加ExceptionHandler注解方法的形参只能是异常类型四、重点2&#xff1a;捕获所有方法的异常—ControllerAdvice注解五、总结六、ResponseStatusExceptionResolve自定义异常显示页…

[go学习笔记.第十一章.项目案例] 1.家庭收支记账软件项目

一.基本介绍 1.项目开发流程说明 2.项目需求说明 目标: 模拟实现一个基于文本界面的<<家庭记账软件>> 掌握初步的编程技巧和调试技巧 主要涉及以下知识点 : (1).局部变量和基本数据类型 (2).循环语句 (3).分支语句 (4).简单的屏幕输出格式控制 (5).进阶&#xff1…