51单片机第5步_string.h库函数

本章介绍string.h库函数的使用;

#include <REG51.h>    //包含头文件REG51.h,使能51内部寄存器;

//#include <intrins.h>  //包含头文件intrins.h,要放在stdio.h的头文件之前;

//使能函数: _nop_();  相当于汇编的NOP指令;

//使能函数: bit  _testbit_( bit bit_value ); 对bit_value进行测试,若bit_value=1,返回1,

//否则返回0;

//使能函数: unsigned char _cror_( unsigned char x, unsigned char n ); 将字节型变量x的值,向

//右循环移动n位,相当于汇编的RR A命令;

//使能函数: unsigned int  _iror_( unsigned int x,  unsigned char n ); 将双字节型变量x的值,

//向右循环移动n位,相当于汇编的RR A命令;

//使能函数: unsigned long _lror_( unsigned long x, unsigned char n ); 将4字节型变量x的值,

//向右循环移动n位,相当于汇编的RR A命令;

//使能函数: unsigned char _crol_( unsigned char x, unsigned char n ); 将字节型变量x的值,向

//左循环移动n位,相当于汇编的RL A命令;

//使能函数: unsigned int  _irol_( unsigned int x,  unsigned char n ); 将双字节型变量x的值,向左循环移动n位,相当于汇编的RL A命令;

//使能函数: unsigned long _lrol_( unsigned long x, unsigned char n ); 将4字节型变量x的值,

//向左循环移动n位,相当于汇编的RL A命令;

//以上的循环左移和循环右移,同C语言的左移和右移是不同的,使用时要小心;

#include <string.h>

//void *memchr(void *s,char val,int n);

//在字符串数组s[]中,搜索前n个字符,查找是否具有val的值,若有,则返回指向val的指针,否则返回

//NULL;

//char memcmp (void *s1, void *s2, int n);

//比较字符串数组s1[]和字符串数组s2[]的前n个字符是否相等,若相等,则返回0;

//若s1>s2,则返回一个正数,若s1<s2,则返回一个负数;

//char strncmp (char *s1, char *s2, int n);

//比较字符串数组s1[]和字符串数组s2[]的前n个字符是否相等,若相等,则返回0;

//若s1>s2,则返回一个正数,若s1<s2,则返回一个负数;

//char strcmp (char *s1, char *s2);

//比较字符串数组s1[]和字符串数组s2[],若s1=s2则返回0,表示这两个字符串是相同的;

//若s1>s2,则返回一个正数,若s1<s2,则返回一个负数;

//char *strcpy (char *s1, char *s2);

//将字符串数组s2[]的字符(包括结束符)拷贝到数组s1[]中,并将数组s1[]的首地址返回;

//char *strncpy (char *s1, char *s2, int n);

//将字符串数组s2[]的前n个字符拷贝到数组s1[]中,若s2的长度小于n,则用0补齐到长度

//n,拷贝到s1中,并将数组s1[]的首地址返回;

//void *memcpy (void *s1, void *s2, int n);

//将字符串数组s2[]的前n个字符拷贝到数组s1[]中,并将数组s1[]的首地址返回;

//注意:s1[]和s2[]是互相独立,没有重叠;

//void *memccpy (void *s1, void *s2, char val, int n);

//将字符串数组s2[]的前n个字符拷贝到数组s1[]中,若拷贝了n个字符,没有遇到val的值,

//则返回NULL;

//在拷贝过程中,若遇到val的值,则在拷贝完该字符后,将指向s1[]的下一个元素的指针返回;

//void *memmove (void *s1, void *s2, int n);

//将字符串数组s2[]的前n个字符拷贝到数组s1[]中,并将数组s1[]的首地址返回;

//注意:s2[]可以是s1[]的一部分,即有重叠部分;

//void *memset  (void *s, char val, int n);

//将s[]的前n个元素设置为val的值;

//char *strcat (char *s1, char *s2);

//将字符串数组s2[]拷贝到字符串数组s1[]的尾部,并将s1[]的首字符指针返回;

//注意:s1[]要可以接受s2的字符串;

//char *strncat (char *s1, char *s2, int n);

//将字符串数组s2[]的前n个字符拷贝到字符串数组s1[]的尾部,并将s1[]的首字符指针返回;

//若字串数组s2[]的元素个数小于n,则只拷贝到s2的结束符,就停止拷贝;

//int strlen (char *s1); //返回字符串s1[]中的字符个数,包括结束符'\0';

//char *strchr (const char *s, char c);

//在s[]中搜索c的值并将第1次出现c值的指针返回,若没有搜索到,则返回NULL;

//int strpos (const char *s, char c);

//在s[]中搜索c的值并将第1次出现c值的位置值返回,若没有搜索到,则返回-1;

//char *strrchr (const char *s, char c);

//在s[]中搜索c的值并将最后1个出现c值的指针返回,若没有搜索到,则返回NULL;

//int strrpos (const char *s, char c);

//在s[]中搜索c的值并将最后1个出现c值的位置值返回,若没有搜索到,则返回-1;

//char *strstr  (char *s, char *sub);

//在s[]中搜索字符串数组sub[]的字符串,并将第1次出现"sub[]的字符串"的指针返回,若没有

//搜索到,则返回NULL;

#include <stdio.h>  //包含头文件stdio.h

       //_getkey();从串口读入一个字符;

   //putchar();向串口发送一个字节;

   //printf();向串口发送一串字节;

//函数功能:测试memchr()函数;

void test_memchr(void)

{ char s[15]="It is test!";

  void *ptr;

  ptr=memchr( s,'!',sizeof(s) ); //在字符串s[]中,搜索所有字符,查找是否具有!的值,若有,

//则返回指向!的指针,否则返回NULL;

  if( ptr==NULL) printf( "! was not found in s[10].\n");

  else printf( "Found ! in s[10].\n" );

}

//函数功能:测试memcmp()函数;

void test_memcmp()

{ char s1[16]="0123456789ABCDEF";

  char s2[16]="0123456789abcdef";

  char i;

  i=memcmp(s1,s2,16);

       //比较字符串数组s1[]和字符串数组s2[]的前n个字符是否相等,若相等,则返回0,

       //若s1>s2,则返回一个正数,若s1<s2,则返回一个负数;

  if(i==0) printf("s1[16]==s2[16],return value = 0.\n");

  else if(i>0) printf("s1[16>]=s2[16],return value is > 0.\n");

  else printf("s1[16]<s2[16],return value < 0.\n");

}

//函数功能:测试memcpy()函数;

void test_memcpy()

{ char s2[]="12345678";

  char s1[11]="aaaaaaaaaa";

  char *ptr;

  ptr=memcpy( s1,s2,sizeof(s1) );

    //将字符串数组s2[]的前9个字符拷贝到数组s1[]中,并将数组s1[]的首地址返回;

  printf( "s1[%bu]=%s\n",sizeof(s2),ptr ); //s1[9]=12345678

}

//函数功能:测试memccpy()函数;

void test_memccpy()

{ unsigned char i=0;

  char s2[10]="123456789";

  char s1[11]="aaaaabcde";

  void *ptr;

  unsigned char * p;

  ptr=memccpy( s1,s2,'5',sizeof(s1) );

       //将字符串数组s2[]的前n个字符拷贝到数组s1[]中,若拷贝了n个字符,

//没有遇到val的值,则返回NULL;

       //在拷贝过程中,若遇到val的值,则在拷贝完该字符后,将指向s1[]的下一个元素的

//指针返回;

  if(ptr==NULL) printf( "5 was not in s2[10];\n" );

  else{ printf( "5 is in s2[10];\n" ); //串口发送,"5 is in s2[10];\n";

        while(s1[i]!='5') i++;

i++;

printf( "s1[%bu]=",i ); //串口发送,"S[5]=";

p=*(&ptr); //将ptr所指向的指针送给p;

i=*p;      //将p所指的内容保存到i中;

printf("%c;\n",i); //串口发送,"b\n";

printf("s[11]=%s;\n",s1); //串口发送:"s[11]=12345bcde;"

      }

}

//函数功能:测试memmove()函数;

void test_memmove()

{ unsigned char s2[]="123"

                    "456"

                    "789";

  unsigned char s1[10]="123";

  printf( "s2[]=%s\n",s2 ); //串口发送:"s2[]=123456789"

  memmove( s2,&s2[2],5 );   //将s2[2]~s2[7]的5个元素拷贝到s2[]数组中;

  printf( "s2[]=%s\n",s2 ); //串口发送:"s2[]=345676789"

  memmove( s1,s2,5 );        //将s2[]的前5个元素拷贝到s1[]中;

  printf( "s1[]=%s\n",s1 );  //串口发送:"s1[]=34567"

  printf( "s2[]=%s\n",s2 );  //串口发送:"s2[]=345676789"

}

//函数功能:测试memset()函数;

void test_memset()

{ char s[10]="123456789";

  memset( s,'*',9 );

  s[9]='\0';               //添加字符串结束符,为printf()打印做准备;

  printf( "s[]=%s\n",s );  //串口发送:"s[]=*********"

}

//函数功能:测试strcat()函数;

void test_strcat()

{ char s2[]="456";

  char s1[10]="123";

  void *ptr;

  ptr=strcat( s1,s2 ); //将字符串数组s2[]拷贝到字符串数组s1[]的尾部,并将s1[]的

//首字符指针返回;

  printf( "s1[]=%s\n",s1 );  //串口发送:"s[]=123456"

  printf( "s1[]=%s\n",ptr );  //串口发送:"s[]=123456"

}

//函数功能:测试strncat()函数;

void test_strncat()

{ char s2[]="DEF";

  char s1[10]="ABC";

  void *ptr;

  ptr=strncat( s1,s2,2 ); //将s2[]的前2个字符拷贝到字符串数组s1[]的尾部,并将s1[]的首字符

//指针返回;

  printf( "s1[]=%s\n",s1 );  //串口发送:"s[]=ABCDE"

  printf( "s1[]=%s\n",ptr );  //串口发送:"s[]=ABCDE"

}

//函数功能:测试strcmp()函数;

void test_strcmp()

{ char s1[]="123";

  char s2[]="321";

  char i;

  i=strcmp(s1,s2);

       //比较字符串数组s1[]和字符串数组s2[]的字符串是否相等,若相等,则返回0,

       //若s1>s2,则返回一个正数,若s1<s2,则返回一个负数;

  if(i==0) printf("s1[]==s2[],return value = 0.\n");

  else if(i>0) printf("s1[>]=s2[],return value is > 0.\n");

  else printf("s1[]<s2[],return value < 0.\n");

}

//函数功能:测试strncmp()函数;

void test_strncmp()

{ char s1[16]="0123456789ABCDEF";

  char s2[16]="0123456789abcdef";

  char i;

  i=strncmp(s1,s2,16);

       //比较字符串数组s1[]和字符串数组s2[]的前16个字符是否相等,若相等,则返回0,

       //若s1>s2,则返回一个正数,若s1<s2,则返回一个负数;

  if(i==0) printf("s1[16]==s2[16],return value = 0.\n");

  else if(i>0) printf("s1[16>]=s2[16],return value is > 0.\n");

  else printf("s1[16]<s2[16],return value < 0.\n");

}

//函数功能:测试strcpy()函数;

void test_strcpy()

{ char s2[]="12345678";

  char s1[11];

  char *ptr;

  ptr=strcpy( s1,s2 );

    //将字符串数组s2[]的字符(包括结束符)拷贝到数组s1[]中,并将数组s1[]的首地址返回;

  printf( "s1[11]=%s\n",ptr ); //s1[11]=12345678

  printf( "s1[11]=%s\n",s1 );  //s1[11]=12345678

}

//函数功能:测试strncpy()函数;

void test_strncpy()

{ char s2[]="abcd";

  char s1[11]="1234567890";

  char *ptr,*p;

  unsigned char i,temp;

  ptr=strncpy( s1,s2,8 );

//将字符串数组s2[]的前8个字符拷贝到数组s1[]中,若s2的长度小于8,则用0补齐到长

//度8,拷贝到s1中,

    //并将数组s1[]的首地址返回;

  printf( "s1[11]=%s\n",ptr ); //s1[11]=abcd

  printf( "s1[11]=%s\n",s1 );  //s1[11]=abcd

  printf( "s1[11]=" );          //s1[11]=

  p=*(&ptr); //将ptr所指向的指针送给p;

  for( i=0;i<4;i++ )

     { temp=*p++; //将p所指的内容保存到temp中;

    printf("%c",temp); //打印字符串:abcd

 }

  for( i=4;i<8;i++ )

     { temp=*p++; //将p所指的内容保存到temp中;

    printf("%bd",temp);  //打印补齐的数据:0000

 }

  for( i=8;i<sizeof(s1)-1;i++ )

     { temp=*p++; //将p所指的内容保存到temp中;

    printf("%c",temp);  //打印字符串:90

 }

  temp=*p; //将p所指的内容保存到temp中;

  printf("%bd",temp);  //打印字符串结束符:\0

  printf( "\n" );

}

//函数功能:测试strlen()函数;

void test_strlen()

{ char s1[11]="1234567890";

  int return_value;

  return_value=strlen(s1);  //返回字符串s1[]中的字符个数,包括结束符'\0';

  printf("s1 length is %d\n",return_value);  //打印:s1 length is 10

  printf( "s1 length is %bd\n",sizeof(s1) );  //打印:s1 length is 11

}

//函数功能:测试strchr()函数;

void test_strchr()

{ char * ptr,*p;

  char s[]="cbcd";

  unsigned char temp;

  int return_value;

  ptr=strchr( s,'c' ); //在s[]中搜索'c'的值并将第1次出现'c'值的指针返回,若没有搜索到,

//则返回NULL;

  return_value= strpos(s,'c'); //在s[]中搜索c的值并将第1次出现c值的位置值返回,若没

//有搜索到,则返回-1;

  p=*(&ptr);   //将ptr所指向的指针送给p;

  temp=*p;  //将p所指的内容保存到temp中;

  if(ptr!=NULL) printf("%c is in s[%d];\n",temp,return_value); //"c is in s[0];"

}

//函数功能:测试strpos()函数;

void test_strpos()

{ char s[]="01234";

  int return_value;

  return_value= strpos(s,'3');

  //在s[]中搜索c的值并将第1次出现c值的位置值返回,若没有搜索到,则返回-1;

  if(return_value!=-1) printf("s[%d]=3\n",return_value); //"s[3]=3"

}

//函数功能:测试strrchr()函数;

void test_strrchr()

{ char * ptr,*p;

  char s[]="cbcd";

  unsigned char temp;

  int return_value;

  ptr=strrchr( s,'c' ); //在s[]中搜索c的值并将最后1个出现c值的指针返回,若没有搜索到,

//则返回NULL;

  return_value= strrpos(s,'c'); //在s[]中搜索c的值并将最后1个出现c值的位置值返回,

//若没有搜索到,则返回-1;

  p=*(&ptr);  //将ptr所指向的指针送给p;

  temp=*p;  //将p所指的内容保存到temp中;

  if(ptr!=NULL) printf("%c is in s[%d];\n",temp,return_value);   //"c is in s[2]"

}

//函数功能:测试strrpos()函数;

void test_strrpos()

{ char s[]="33234";

  int return_value;

  return_value=strrpos(s,'3');

//在s[]中搜索c的值并将最后1个出现c值的位置值返回,若没有搜索到,则返回-1;

  if(return_value!=-1) printf("s[%d]=3\n",return_value);  //"s[3]=3"

}

//函数功能:测试strstr()函数;

void test_strstr()

{ char * ptr,*p;

  char s[]="1234aabcd5678abcd";

  char sub[]="abcd";

  unsigned char temp,i;

  ptr=strstr( s,sub );

  //在s[]中搜索字符串数组sub[]的字符串,并将第1次出现"sub[]的字符串"的指针返回,

//若没有搜索到,则返回NULL;

  p=*(&ptr);    //将ptr所指向的指针送给p;

  if(ptr!=NULL)

    { printf("s[]=1234a");

  for(i=0;i<12;i++)

    { temp=*p++;        //将p所指的内容保存到temp中;

  printf("%c",temp);  //"abcd5678abcd"

}

  printf("\n");

}

}

//函数功能:初始化串口,设置波特率为1200bps@16MHz,使能接收,使用8位UART;

void Serial_Port_Initialization()

{ SCON  = 0x50; //串行控制寄存器: SM0,SM1,SM2,REN,TB8,RB8,TI,RI

                //SM1:SM0=01,选择方式1,SM2=0,表示非多机通讯,8-bit UART;

//REN=1,使能接收;

  TMOD |= 0x20; //定时器方式控制寄存器:GATE1,C/T1,M11,M10,GATE0,C/T0,M01,M00

                //GATE=0,TR置1便可以启动Timer;GATE=1,TR置1,且INT脚输入

//高电平,才可以启动Timer;

//M11:M10=10,选择方式2,8位自动重装载;

  TH1   = 221;  //TH1:  reload value for 1200 baud @ 16MHz

  TR1   = 1;    //启动Timer1;

  TI    = 1;    //发送UART的第一个字节,为下次发送做准备;

}

void main(void)

{

  Serial_Port_Initialization(); //初始化串口,设置波特率为1200bps@16MHz,使能接收,使用8位UART;

  for(;;)

     { test_memchr();   //测试memchr()函数;

    test_memcmp();  //测试memcmp()函数;

test_memcpy();   //测试memcpy()函数;

test_memccpy(); //测试memccpy()函数;

test_memmove();  //测试memmove()函数;

test_memset();    //测试memset()函数;

test_strcat();     //测试strcat()函数;

test_strncat();    //测试strncat()函数;

test_strcmp();    //测试strcmp()函数;

test_strncmp(); //测试strncmp()函数;

test_strcpy();     //测试strcpy()函数;

test_strncpy();    //测试strncpy()函数;

test_strlen();     //测试strlen()函数;

test_strchr();    //测试strchr()函数;

test_strpos();     //测试strpos()函数;

test_strrchr();    //测试strrchr()函数;

test_strrpos();    //测试strrpos()函数;

test_strstr();    //测试strstr()函数;

 }

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

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

相关文章

字符设备驱动程序

简单做个模板框架 字符设备开发流程 确定设备号dev_t&#xff0c;动态分配 alloc_chrdev_region() 或静态分配 register_chrdev_region()定义file_opeartion 结构体*fops *&#xff0c;在结构体成员中实现对应的 *open()、read()*等函数。cdev_init() 将 fops 与 cdev 绑定&…

STM32学习历程(day2)

GPIO解释 GPIO(General-purpose input/output) 可以配置为八种输入输出模式 引脚电平 0V-3.3V 部分引脚可容忍5v 输出模式可控制端口输出高低电平 用以驱动LED、控制蜂鸣器、模拟通信协议输出时序 输入模式可读取端口的高低电平或电压&#xff0c;用于读取按键输入、外界…

firefly rk3588 sdk安装问题记录

目录 一、python版本不对 1.1 下载python2.6 1.2 安装python2.6 1.3 安装遇到问题 二、安装hashlib 三、更新3588 SDK代码 一、python版本不对 我的环境的python版本是python3.7。初次安装的时候执行命令报错&#xff0c;说是版本不对导致 fuhdell:rk3588_sdk$ .repo/rep…

centos通过官网下载安装最新版mysql方案

官网下载步骤&#xff1a; 点击DOCUMENTATION mysql的yum仓库Using the MySQL Yum Repository 向下翻&#xff0c;查看安装命令 点击下载mysql安装包 下载对应的版本 不注册&#xff0c;直接下载社区版 下载好的安装包 安装步骤&#xff1a; 把rpm包导入到服务器…

AI 驱动的数据中心变革与前景

文章主要探讨了AI计算时代数据中心的转型&#xff0c;涉及计算技术的多样性、规格尺寸和加速器的发展、大型语言模型&#xff08;LLM&#xff09;的发展、功耗和冷却趋势、基准测试的重要性以及数据中心的发展等方面。为大家提供深入了解AI基础设施发展的视角。 计算技术的多样…

​浅谈 Linux 中的 core dump 分析方法

在 Linux 系统开发领域中&#xff0c;core dump&#xff08;核心转储&#xff09;是一个不可或缺的工具&#xff0c;它为我们提供了在程序崩溃时分析程序状态的重要线索。当程序因为某种原因&#xff08;如段错误、非法指令等&#xff09;异常终止时&#xff0c;Linux 系统会尝…

spring boot + vue3+element plus 项目搭建

一、vue 项目搭建 1、创建 vue 项目 vue create vue-element说明:创建过程中可以选择路由,也可也可以不选择,可以通过 npm install 安装 vue 项目目录结构 说明:api 为自己创建的文件夹,router 选择路由模块会自动创建 router下的index.js文件(配置路由的文件) im…

泰国内部安全行动司令部数据泄露

BreachForums 论坛的一名成员宣布发生一起重大数据泄露事件&#xff0c;涉及泰国内部安全行动司令部 (ISOC)&#xff0c;该机构被称为泰国皇家武装部队的政治部门。 目前&#xff0c;我们无法准确确认此次泄露的真实性&#xff0c;因为该组织尚未在其网站上发布有关该事件的任…

微信开发者工具报错 Error: module ‘xxx.js‘ is not defined, require args is ‘xxx.js‘

背景 报错如下 检查 代码逻辑和写法都是ok的重新打开项目又是可以的 解决方案 先确保微信开发者工具和uniapp的将js编译成es5都开着&#xff08;这个是默认开的&#xff09; 然后把微信开发者工具关了重开 一般做这一步就会好了&#xff0c;但是只是临时解决 &#xff08…

如何使用 3D 建模库在 C# 中将 3DS 转换为 USDZ?

USDZ/USD是一种 3D 文件格式&#xff0c;被广泛用于跨平台共享 3D 资产。另一方面&#xff0c;3DS是另一种以块形式存储数据的 3D 文件格式。在某些情况下&#xff0c;您需要将3DS 文件转换为 USDZ/USD文件格式。因此&#xff0c;本篇博文介绍了一个功能丰富的3D 建模库&#x…

记录一下简单导入导出excel二级表头

数据库导入导出表头 之前的工具类GenerateExcelToFile新增两个导出这种二级表头方法 package com.njry.utils;import cn.hutool.core.util.IdUtil; import com.njry.config.FileProperties; import com.njry.exception.BadRequestException; import org.apache.poi.hssf.user…

《Winodws API每日一练》8.2 static控件

在 Windows 编程中&#xff0c;"Static" 控件是一种常见的用户界面元素&#xff0c;用于显示静态文本或图像&#xff0c;而无法进行用户交互。它通常用于显示标签、标题、说明文本或静态图像等信息。Static 控件是一种静态的、只读的显示元素&#xff0c;不接受用户的…

JAVA 快递100wms工具类

快递wms工具类 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.kuaidi100.sdk.api.QueryTrack; import com.kuaidi100.sdk.api.Subscribe; import com.kuaidi100.sdk.contant.ApiInfoConstant; import c…

11.SQL注入-盲注基于(base on boolian)

SQL注入-盲注基于boolian案例利用 首先总结一下sql语句中的函数意思 #查看当前所在的数据库 mysql> select database(); ------------ | database() | ------------ | pikachu | ------------ 1 row in set (0.00 sec)#函数substr里1是从第几位开始取字符&#xff0c;2…

mybatis-使用自动生成(根据数据库反向生成pojo、映射文件,映射接口)

1.在pom.xml中导入依赖和插件 <dependencies> <!-- 导入自动生成依赖--><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.0</version>&…

【PCIe】P2P DMA

PCIe P2P (peer-to-peer communication)是PCIe的一种特性&#xff0c;它使两个PCIe设备之间可以直接传输数据&#xff0c;而不需要使用主机RAM作为临时存储。如下图3的走向 比如EP1要发送和数据给EP2,操作流程如下&#xff1a; 1. 打开EP1的dma控制器&#xff1b;--client侧 …

go开源webssh终端源码main.go分析

1.地址: https://github.com/Jrohy/webssh.git 2.添加中文注释地址: https://github.com/tonyimax/webssh_cn.git main.go分析 主包名&#xff1a;main package main //主包名 依赖包加载 //导入依赖包 import ("embed" //可执行文件…

密码学复习

目录 基础 欧拉函数 欧拉函数φ(n)定义 计算方法的技巧 当a=a_1*a_2*……*a_n时 欧拉定理 剩余系 一些超简单密码 维吉尼亚 密钥fox 凯撒(直接偏移) 凯特巴氏(颠倒字母表) 摩斯密码(字母对应电荷线) 希尔(hill)密码 一些攻击 RSA 求uf+vg=1 快速幂模m^…

苹果获得OpenAI董事会观察员职位、Runway最新估值40亿美元

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 据知情人士透露&#xff0c;苹果应用商店&#xff08;App Store&#xff09;负责人、前营销主管Phil Schiller被选中担任这一职位。这位知情人士说&#xff0c;作为董事会观察员&#xff0c;他不会以正…

二次搭建无人车平台遇到的问题(mid360+joy游戏手柄操纵无人车)

joy节点启动 报错&#xff1a; ROS path [0]/opt/ros/noetic/share/ros ROS path [1]/home/jetson/yahboomcar_ws/src/yahboomcar_autodrive ROS path [2]/home/jetson/yahboomcar_ws/src/yahboomcar_bringup ROS path [3]/home/jetson/yahboomcar_ws/src/yahboomcar_ctrl ROS…