音频demo:将PCM数据与alaw、mulaw、g711数据的相互转换

1、README

前言

g711

(截图来源:https://blog.csdn.net/u014470361/article/details/88837776)

我的理解:

首先需要知道的是u-law/a-law是用于脉冲编码的压缩/解压缩算法。而G.711是指在8KHz采样率(单声道)中,使用的u-law或a-law算法对音频进行压缩的一种语音压缩标准。但是,使用这两种压缩算法进行压缩的音频并不一定是G.711,要在8KHz采样率(单声道)的才是,压缩其他采样率和多声道得到的u-law/a-law文件只要设置对应的采样率和声道数照样能解压播放。

a. 编译

demo引用了开源代码g711.cg711.h,然后在此基础上封装成g711_wraper.cg711_wraper.h,并编写自己的测试程序main.c进行验证。整个demo程序共5个源文件,可以编译到任意环境下使用(非类Unix系统可能需要简单调整main.c中包含的头文件):

$ make   # 或者: make CC=your-crosscompile-gcc
b. 使用
examples: ./pcm_alaw_ulaw -h./pcm_alaw_ulaw --help./pcm_alaw_ulaw -m pcm_2_alaw -i ./audio/test_8000_16_1.pcm -o ./test_8000_8_1.g711a./pcm_alaw_ulaw -m pcm_2_ulaw -i ./audio/test_8000_16_1.pcm -o ./test_8000_8_1.g711u./pcm_alaw_ulaw -m alaw_2_pcm -i ./audio/test_8000_8_1.g711a -o ./test_8000_16_1.pcm./pcm_alaw_ulaw -m ulaw_2_pcm -i ./audio/test_8000_8_1.g711u -o ./test_8000_16_1.pcm./pcm_alaw_ulaw -m alaw_2_ulaw -i ./audio/test_8000_8_1.g711a -o ./test_8000_8_1.g711u./pcm_alaw_ulaw -m ulaw_2_alaw -i ./audio/test_8000_8_1.g711u -o ./test_8000_8_1.g711a./pcm_alaw_ulaw --mode pcm_2_ulaw --input_file=./audio/test_8000_16_2.pcm --output_file=./test_8000_8_2.ulaw./pcm_alaw_ulaw --mode pcm_2_ulaw --input_file=./audio/test_22050_16_1.pcm --output_file=./test_22050_8_1.ulaw./pcm_alaw_ulaw --mode pcm_2_alaw --input_file=./audio/test_44100_16_2.pcm --output_file=./test_44100_8_2.alaw...[mode: pcm_2_alaw | pcm_2_ulaw | alaw_2_pcm | ulaw_2_pcm | alaw_2_ulaw | ulaw_2_alaw]
c. demo目录架构
.
├── audio
│   ├── test_22050_16_1.pcm
│   ├── test_22050_8_1.ulaw
│   ├── test_44100_16_2.pcm
│   ├── test_44100_8_2.alaw
│   ├── test_8000_16_1.pcm
│   ├── test_8000_16_2.pcm
│   ├── test_8000_8_1.g711a
│   ├── test_8000_8_1.g711u
│   └── test_8000_8_2.ulaw
├── docs
│   ├── G711编码原理及代码_szfhy的博客-CSDN博客_g711编码.mhtml
│   └── 音频采样及编解码——LPCM 、ADPCM、G711、G726、AAC_夜风的博客-CSDN博客_adpcm.mhtml
├── main.c
├── Makefile
├── pcm_aulaw.c
├── pcm_aulaw.h
├── pcm_aulaw_wraper.c
├── pcm_aulaw_wraper.h
└── README.md

2、主要代码片段

pcm_aulaw.c
/** This source code is a product of Sun Microsystems, Inc. and is provided* for unrestricted use.  Users may copy or modify this source code without* charge.** SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING* THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.** Sun source code is provided with no support and without any obligation on* the part of Sun Microsystems, Inc. to assist in its use, correction,* modification or enhancement.** SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE* OR ANY PART THEREOF.** In no event will Sun Microsystems, Inc. be liable for any lost revenue* or profits or other special, indirect and consequential damages, even if* Sun has been advised of the possibility of such damages.** Sun Microsystems, Inc.* 2550 Garcia Avenue* Mountain View, California  94043*/
/** December 30, 1994:* Functions linear2alaw, linear2ulaw have been updated to correctly* convert unquantized 16 bit values.* Tables for direct u- to A-law and A- to u-law conversions have been* corrected.* Borge Lindberg, Center for PersonKommunikation, Aalborg University.* bli@cpk.auc.dk**/
/** Downloaded from comp.speech site in Cambridge.**/#include "pcm_aulaw.h"/** pcm_aulaw.c** u-law, A-law and linear PCM conversions.* Source: http://www.speech.kth.se/cost250/refsys/latest/src/g711.c*/
#define	SIGN_BIT	(0x80)		/* Sign bit for a A-law byte. */
#define	QUANT_MASK	(0xf)		/* Quantization field mask. */
#define	NSEGS		(8)		/* Number of A-law segments. */
#define	SEG_SHIFT	(4)		/* Left shift for segment number. */
#define	SEG_MASK	(0x70)		/* Segment field mask. */static short seg_aend[8] = {0x1F, 0x3F, 0x7F, 0xFF,0x1FF, 0x3FF, 0x7FF, 0xFFF};
static short seg_uend[8] = {0x3F, 0x7F, 0xFF, 0x1FF,0x3FF, 0x7FF, 0xFFF, 0x1FFF};/* copy from CCITT G.711 specifications */
unsigned char _u2a[128] = {			/* u- to A-law conversions */1,	1,	2,	2,	3,	3,	4,	4,5,	5,	6,	6,	7,	7,	8,	8,9,	10,	11,	12,	13,	14,	15,	16,17,	18,	19,	20,	21,	22,	23,	24,25,	27,	29,	31,	33,	34,	35,	36,37,	38,	39,	40,	41,	42,	43,	44,46,	48,	49,	50,	51,	52,	53,	54,55,	56,	57,	58,	59,	60,	61,	62,64,	65,	66,	67,	68,	69,	70,	71,72,	73,	74,	75,	76,	77,	78,	79,
/* corrected:81,	82,	83,	84,	85,	86,	87,	88, should be: */80,	82,	83,	84,	85,	86,	87,	88,89,	90,	91,	92,	93,	94,	95,	96,97,	98,	99,	100,	101,	102,	103,	104,105,	106,	107,	108,	109,	110,	111,	112,113,	114,	115,	116,	117,	118,	119,	120,121,	122,	123,	124,	125,	126,	127,	128};unsigned char _a2u[128] = {			/* A- to u-law conversions */1,	3,	5,	7,	9,	11,	13,	15,16,	17,	18,	19,	20,	21,	22,	23,24,	25,	26,	27,	28,	29,	30,	31,32,	32,	33,	33,	34,	34,	35,	35,36,	37,	38,	39,	40,	41,	42,	43,44,	45,	46,	47,	48,	48,	49,	49,50,	51,	52,	53,	54,	55,	56,	57,58,	59,	60,	61,	62,	63,	64,	64,65,	66,	67,	68,	69,	70,	71,	72,
/* corrected:73,	74,	75,	76,	77,	78,	79,	79,should be: */73,	74,	75,	76,	77,	78,	79,	80,80,	81,	82,	83,	84,	85,	86,	87,88,	89,	90,	91,	92,	93,	94,	95,96,	97,	98,	99,	100,	101,	102,	103,104,	105,	106,	107,	108,	109,	110,	111,112,	113,	114,	115,	116,	117,	118,	119,120,	121,	122,	123,	124,	125,	126,	127};static short search(short val,short *table,short size)
{short i;for (i = 0; i < size; i++) {if (val <= *table++)return (i);}return (size);
}/** linear2alaw() - Convert a 16-bit linear PCM value to 8-bit A-law** linear2alaw() accepts an 16-bit integer and encodes it as A-law data.**		Linear Input Code	Compressed Code*	------------------------	---------------*	0000000wxyza			000wxyz*	0000001wxyza			001wxyz*	000001wxyzab			010wxyz*	00001wxyzabc			011wxyz*	0001wxyzabcd			100wxyz*	001wxyzabcde			101wxyz*	01wxyzabcdef			110wxyz*	1wxyzabcdefg			111wxyz** For further information see John C. Bellamy's Digital Telephony, 1982,* John Wiley & Sons, pps 98-111 and 472-476.*/
unsigned char
linear2alaw(short pcm_val)	/* 2's complement (16-bit range) */
{short	 mask;short	 seg;unsigned char aval;pcm_val = pcm_val >> 3;if (pcm_val >= 0) {mask = 0xD5;		/* sign (7th) bit = 1 */} else {mask = 0x55;		/* sign bit = 0 */pcm_val = -pcm_val - 1;}/* Convert the scaled magnitude to segment number. */seg = search(pcm_val, seg_aend, 8);/* Combine the sign, segment, and quantization bits. */if (seg >= 8)		/* out of range, return maximum value. */return (unsigned char) (0x7F ^ mask);else {aval = (unsigned char) seg << SEG_SHIFT;if (seg < 2)aval |= (pcm_val >> 1) & QUANT_MASK;elseaval |= (pcm_val >> seg) & QUANT_MASK;return (aval ^ mask);}
}/** alaw2linear() - Convert an A-law value to 16-bit linear PCM**/
short
alaw2linear(unsigned char	a_val)
{short t;short seg;a_val ^= 0x55;t = (a_val & QUANT_MASK) << 4;seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT;switch (seg) {case 0:t += 8;break;case 1:t += 0x108;break;default:t += 0x108;t <<= seg - 1;}return ((a_val & SIGN_BIT) ? t : -t);
}#define	BIAS		(0x84)		/* Bias for linear code. */
#define CLIP            8159/*
* linear2ulaw() - Convert a linear PCM value to u-law
*
* In order to simplify the encoding process, the original linear magnitude
* is biased by adding 33 which shifts the encoding range from (0 - 8158) to
* (33 - 8191). The result can be seen in the following encoding table:
*
*	Biased Linear Input Code	Compressed Code
*	------------------------	---------------
*	00000001wxyza			000wxyz
*	0000001wxyzab			001wxyz
*	000001wxyzabc			010wxyz
*	00001wxyzabcd			011wxyz
*	0001wxyzabcde			100wxyz
*	001wxyzabcdef			101wxyz
*	01wxyzabcdefg			110wxyz
*	1wxyzabcdefgh			111wxyz
*
* Each biased linear code has a leading 1 which identifies the segment
* number. The value of the segment number is equal to 7 minus the number
* of leading 0's. The quantization interval is directly available as the
* four bits wxyz.  * The trailing bits (a - h) are ignored.
*
* Ordinarily the complement of the resulting code word is used for
* transmission, and so the code word is complemented before it is returned.
*
* For further information see John C. Bellamy's Digital Telephony, 1982,
* John Wiley & Sons, pps 98-111 and 472-476.
*/
unsigned char
linear2ulaw(short pcm_val)	/* 2's complement (16-bit range) */
{short         mask;short	 seg;unsigned char uval;/* Get the sign and the magnitude of the value. */pcm_val = pcm_val >> 2;if (pcm_val < 0) {pcm_val = -pcm_val;mask = 0x7F;} else {mask = 0xFF;}if ( pcm_val > CLIP ) pcm_val = CLIP;		/* clip the magnitude */pcm_val += (BIAS >> 2);/* Convert the scaled magnitude to segment number. */seg = search(pcm_val, seg_uend, 8);/** Combine the sign, segment, quantization bits;* and complement the code word.*/if (seg >= 8)		/* out of range, return maximum value. */return (unsigned char) (0x7F ^ mask);else {uval = (unsigned char) (seg << 4) | ((pcm_val >> (seg + 1)) & 0xF);return (uval ^ mask);}}/** ulaw2linear() - Convert a u-law value to 16-bit linear PCM** First, a biased linear code is derived from the code word. An unbiased* output can then be obtained by subtracting 33 from the biased code.** Note that this function expects to be passed the complement of the* original code word. This is in keeping with ISDN conventions.*/
short
ulaw2linear(unsigned char	u_val)
{short t;/* Complement to obtain normal u-law value. */u_val = ~u_val;/** Extract and bias the quantization bits. Then* shift up by the segment number and subtract out the bias.*/t = ((u_val & QUANT_MASK) << 3) + BIAS;t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT;return ((u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS));
}/* A-law to u-law conversion */
unsigned char
alaw2ulaw(unsigned char	aval)
{aval &= 0xff;return (unsigned char) ((aval & 0x80) ? (0xFF ^ _a2u[aval ^ 0xD5]) :(0x7F ^ _a2u[aval ^ 0x55]));
}/* u-law to A-law conversion */
unsigned char
ulaw2alaw(unsigned char	uval)
{uval &= 0xff;return (unsigned char) ((uval & 0x80) ? (0xD5 ^ (_u2a[0xFF ^ uval] - 1)) :(0x55 ^ (_u2a[0x7F ^ uval] - 1)));
}/* ---------- end of pcm_aulaw.c ----------------------------------------------------- */
pcm_aulaw_wraper.c
#include "pcm_aulaw.h"
#include "pcm_aulaw_wraper.h"void pcm_2_alaw(const short *src_16lepcm, unsigned char *dst_alaw, unsigned int sample_cnt)
{for (int i = 0; i < sample_cnt; i++){dst_alaw[i] = linear2alaw(src_16lepcm[i]);}
}void alaw_2_pcm(const unsigned char *src_alaw, short *dst_16lepcm, unsigned int sample_cnt)
{for (int i = 0; i < sample_cnt; i++){dst_16lepcm[i] = alaw2linear(src_alaw[i]);}
}void pcm_2_ulaw(const short *src_16lepcm, unsigned char *dst_ulaw, unsigned int sample_cnt)
{for (int i = 0; i < sample_cnt; i++){dst_ulaw[i] = linear2ulaw(src_16lepcm[i]);}
}void ulaw_2_pcm(const unsigned char *src_ulaw, short *dst_16lepcm, unsigned int sample_cnt)
{for (int i = 0; i < sample_cnt; i++){dst_16lepcm[i] = ulaw2linear(src_ulaw[i]);}
}void alaw_2_ulaw(const unsigned char *src_alaw, char *dst_ulaw, unsigned int sample_cnt)
{for (int i = 0; i < sample_cnt; i++){dst_ulaw[i] = alaw2ulaw(src_alaw[i]);}
}void ulaw_2_alaw(const unsigned char *src_ulaw, char *dst_alaw, unsigned int sample_cnt)
{for (int i = 0; i < sample_cnt; i++){dst_alaw[i] = ulaw2alaw(src_ulaw[i]);}
}
main.c
#include <stdio.h>
#include <string.h>
#include <getopt.h>
#include <unistd.h>#include "pcm_aulaw_wraper.h"void print_usage(const char *process)
{printf("examples: \n""\t %s -h\n""\t %s --help\n""\t %s -m pcm_2_alaw -i ./audio/test_8000_16_1.pcm -o ./test_8000_8_1.g711a\n""\t %s -m pcm_2_ulaw -i ./audio/test_8000_16_1.pcm -o ./test_8000_8_1.g711u\n""\t %s -m alaw_2_pcm -i ./audio/test_8000_8_1.g711a -o ./test_8000_16_1.pcm\n""\t %s -m ulaw_2_pcm -i ./audio/test_8000_8_1.g711u -o ./test_8000_16_1.pcm\n""\t %s -m alaw_2_ulaw -i ./audio/test_8000_8_1.g711a -o ./test_8000_8_1.g711u\n""\t %s -m ulaw_2_alaw -i ./audio/test_8000_8_1.g711u -o ./test_8000_8_1.g711a\n""\t %s --mode pcm_2_ulaw --input_file=./audio/test_8000_16_2.pcm --output_file=./test_8000_8_2.ulaw\n""\t %s --mode pcm_2_ulaw --input_file=./audio/test_22050_16_1.pcm --output_file=./test_22050_8_1.ulaw\n""\t %s --mode pcm_2_alaw --input_file=./audio/test_44100_16_2.pcm --output_file=./test_44100_8_2.alaw\n""\t ...\n""\t [mode: pcm_2_alaw | pcm_2_ulaw | alaw_2_pcm | ulaw_2_pcm | alaw_2_ulaw | ulaw_2_alaw]\n\n",process, process, process, process, process, process, process, process, process, process, process);
}#define 	BUF_LEN 	(160)int main(int argc, char **argv)
{/* 输入/输出文件 */FILE *fpInput = NULL;FILE *fpOutput = NULL;char inputFileName[128] = {0};char outputFileName[128] = {0};	char inputBuf[BUF_LEN*2] = {0};char outputBuf[BUF_LEN*2] = {0};/* 输入文件与输出文件的转换模式 */	char convert_mode[128] = {0};	if (argc == 1){print_usage(argv[0]);return 0;}/* 解析命令行参数 */char option = 0;int option_index = 0;char *short_options = "hm:i:o:";struct option long_options[] ={{"help",        no_argument,       NULL, 'h'},{"mode",        required_argument, NULL, 'm'},{"input_file",  required_argument, NULL, 'i'},{"output_file", required_argument, NULL, 'o'},{NULL,          0,                 NULL,  0 },};while((option = getopt_long_only(argc, argv, short_options, long_options, &option_index)) != -1){switch(option){case 'h':print_usage(argv[0]);return 0;case 'm':strncpy(convert_mode, optarg, 128);break;case 'i':strncpy(inputFileName, optarg, 128);break;case 'o':strncpy(outputFileName, optarg, 128);break;defalut:printf("Unknown argument!\n");break;}}fpInput = fopen(inputFileName, "rb");if (fpInput == NULL){perror("Open input file error");return -1;}fpOutput = fopen(outputFileName, "wb");if (fpOutput == NULL){perror("Open output file error");return -1;}while(1){/* read data */int readBytes = fread(inputBuf, 1, BUF_LEN, fpInput);if (readBytes <= 0){break;}/* convert and write data */if(0 == strcmp(convert_mode, "pcm_2_alaw")){pcm_2_alaw((const short *)inputBuf, outputBuf, readBytes/2);fwrite(outputBuf, 1, readBytes/2, fpOutput);}else if(0 == strcmp(convert_mode, "pcm_2_ulaw")){pcm_2_ulaw((const short *)inputBuf, outputBuf, readBytes/2);fwrite(outputBuf, 1, readBytes/2, fpOutput);}else if(0 == strcmp(convert_mode, "alaw_2_pcm")){alaw_2_pcm(inputBuf, (short *)outputBuf, readBytes);fwrite(outputBuf, 1, readBytes*2, fpOutput);}else if(0 == strcmp(convert_mode, "ulaw_2_pcm")){ulaw_2_pcm(inputBuf, (short *)outputBuf, readBytes);fwrite(outputBuf, 1, readBytes*2, fpOutput);}else if(0 == strcmp(convert_mode, "alaw_2_ulaw")){alaw_2_ulaw(inputBuf, outputBuf, readBytes);fwrite(outputBuf, 1, readBytes, fpOutput);}else if(0 == strcmp(convert_mode, "ulaw_2_alaw")){ulaw_2_alaw(inputBuf, outputBuf, readBytes);fwrite(outputBuf, 1, readBytes, fpOutput);}else{printf("The convert mode is not supported!\n");goto error_exit;}}printf("\033[32m %s ==> %s Success!\033[0m\n", inputFileName, outputFileName);error_exit:fclose(fpInput);fclose(fpOutput);return 0;
}

3、demo下载地址(任选一个)

  • https://download.csdn.net/download/weixin_44498318/89525479

  • https://gitee.com/linriming/audio_pcm_alaw_ulaw_g711_convert.git

  • https://github.com/linriming20/audio_pcm_alaw_ulaw_g711_convert.git

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

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

相关文章

LLM- 注意力机制

一&#xff1a;什么是注意力机制&#xff0c;以及产生背景&#xff1f; &#xff08;1&#xff09;&#xff1a;RNN模型[RNN模型]的缺点&#xff1a;下图是例如RNN模型解决机器翻译的例子&#xff0c;从这个例子可以看到Encoder最后一个向量&#xff08;eos&#xff09;送给了…

B端全局导航:左侧还是顶部?不是随随便便,有依据在。

一、什么是全局导航 B端系统的全局导航是指在B端系统中的主要导航菜单&#xff0c;它通常位于系统的顶部或左侧&#xff0c;提供了系统中各个模块和功能的入口。全局导航菜单可以帮助用户快速找到和访问系统中的各个功能模块&#xff0c;提高系统的可用性和用户体验。 全局导航…

Kubernetes平台迁移

Kubernetes&&平台迁移 信息收集 信息收集

计算机的错误计算(二十五)

摘要 介绍&#xff08;不&#xff09;停机问题。给了一个算式&#xff0c;当计算机的输出为0时&#xff0c;一般需要提高计算精度继续计算&#xff0c;一直到获得非0值或有效数字。但是&#xff0c;由于事先不清楚算式的准确值是否为0或不为0&#xff0c;因此往往陷入两难境地…

【Java15】继承

继承是面向对象三大特征之一&#xff0c;也是软件代码服用的重要手段。 Java只允许单继承&#xff0c;即每个子类只有一个直接父类。 C中的多继承被Java舍弃了&#xff0c;原因是多继承一方面难以准确表述类之间的关系&#xff0c;另一方面很容易造成代码错误。总结起来就两个…

双系统ubuntu20.04扩容

windows端 打开磁盘管理器&#xff0c;选择需要的盘点击压缩卷 点击未分配的盘&#xff0c;新建简单卷&#xff0c;一致点击下一步即可&#xff0c;记住分配的大小容量 ubuntu端 lsblk 查看所有的磁盘&#xff0c;可以看到新增为nvme0n1p4、nvme1n1p2 win分配的格式为NTFS&a…

【Excel】 批量跳转图片

目录标题 1. CtrlA全选图片 → 右键 → 大小和属性2. 取消 锁定纵横比 → 跳转高度宽度 → 关闭窗口3. 最后一图拉到最后一单元格 → Alt吸附边框![](https://i-blog.csdnimg.cn/direct/d56ac1f41af54d54bb8c68339b558dd1.png)4. CtrlA全选图片 → 对齐 → 左对齐 → 纵向分布!…

全网最适合入门的面向对象编程教程:11 类和对象的Python实现-子类调用父类方法-模拟串口传感器和主机

全网最适合入门的面向对象编程教程&#xff1a;11 类和对象的 Python 实现-子类调用父类方法-模拟串口传感器和主机 摘要&#xff1a; 本节课&#xff0c;我们主要讲解了在 Python 类的继承中子类如何进行初始化、调用父类的属性和方法&#xff0c;同时讲解了模拟串口传感器和…

OpenHarmony 入门——单元测试UnitTest快速入门

引言 OpenHarmony 的单元测试&#xff08;UnitTest&#xff09;是一个关键的软件开发过程&#xff0c;它确保代码的各个部分能够按预期工作&#xff0c;OpenHarmony的测试框架中提供了很多种的单元测试&#xff0c;今天简单介绍下UnitTest 类型的TDD测试。 OpenHarmony 的TDD …

Nacos 国际化

项目需要&#xff0c;后端异常信息需要进行国际化处理。所有想有没有方便易用的可选项。 1、国际化配置调整&#xff0c;不需要重启系统 2、可支持添加不同或自定义语言包&#xff08;就是配置的资源文件&#xff09; 参考&#xff1a; Nacos实现SpringBoot国际化的增强_spr…

LeetCode热题100刷题9:25. K 个一组翻转链表、101. 对称二叉树、543. 二叉树的直径、102. 二叉树的层序遍历

25. K 个一组翻转链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), nex…

go语言day12 包 init() time包 file包

包 包中的 结构体 及结构体属性 方法 都可以通过设置首字母大小写来实现权限访问&#xff0c;首字母大写任何包中都可以访问&#xff0c;首字母小写只在同包中可以访问。 再导入包go文件时&#xff0c;可以给.go文件取别名。 在导入的包名前加入 _ 意思是调用该包的初始…

普中51单片机:矩阵按键扫描与应用详解(五)

文章目录 引言电路图开发板IO连接矩阵键盘的工作原理行列扫描逐行/逐列扫描 LCD1602代码库代码演示——暴力扫描代码演示——数码管(行列式)代码演示——线翻转法代码演示——LCD1602密码锁 引言 矩阵按键是一种通过行列交叉连接的按键阵列&#xff0c;可以有效地减少单片机I/…

计算机网络 - 万字长文

计算机网络 二、计算机网络2.1 七层模型表格2.2 通俗讲解七层模型2.3 TCP与UDP对比2.4 TCP 三次握手过程==为什么握手是三次,而不是两次或者四次?====三次握手可以携带数据吗?====TCP三次握手失败,服务端会如何处理?====什么是半连接队列?全连接====ISN(Initial Sequence…

基于单片机的太阳能热水器控制系统设计

随着我国经济水平的不断提高&#xff0c;民众对生活质量的追求也在不断进步&#xff0c;对于现代家庭而言&#xff0c;热水器成为了必备的生活电器。目前市面上的电器主要是电热水器、燃气热水器以及太阳能热水器。就能源节约性能而言&#xff0c;太阳能热水器占据了绝对优势&a…

Java | Leetcode Java题解之第223题矩形面积

题目&#xff1a; 题解&#xff1a; class Solution {public int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {int area1 (ax2 - ax1) * (ay2 - ay1), area2 (bx2 - bx1) * (by2 - by1);int overlapWidth Math.min(ax2, bx2) -…

开源高效在线电子表格解决方案:Luckysheet

Luckysheet&#xff1a;体验幸运&#xff0c;掌握高效数据表格编辑&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 Luckysheet 是一个功能强大、配置简单且完全开源的在线电子表格工具&#xff0c;它类似于我们熟知的 Excel&#xff0c;但更加灵活和易于集成。它是一…

windows环境下部署多个端口Tomcat服务和开机自启动设置保姆级教程

前言 本文主要介绍了 windows环境下&#xff0c;配置多个Tomcat设置不同端口启动服务。其实在思路上Linux上也是适用的&#xff0c;只是 Linux 上没有可视化客户端&#xff0c;会麻烦些&#xff0c;但总体的思路上是一样的。 注&#xff1a;文章中涉及些文字和图片是搬运了其他…

OpenGL3.3_C++_Windows(28)

Demo演示 demo 视差贴图 视差/高度/位移贴图&#xff08;黑--白&#xff09;&#xff1a;和法线贴图一样视差贴图能够极大提升表面细节&#xff0c;使之具有深度感。第一种思路&#xff08;置换顶点&#xff09;&#xff1a;对于一个quad &#xff0c;分成约1000个顶点&#x…

C语言 | Leetcode C语言题解之第223题矩形面积

题目&#xff1a; 题解&#xff1a; int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {int area1 (ax2 - ax1) * (ay2 - ay1), area2 (bx2 - bx1) * (by2 - by1);int overlapWidth fmin(ax2, bx2) - fmax(ax1, bx1), overlapHei…