压缩指定字符

压缩字符串 已支持(Java & JS & Python & C & C++),实现:最小循环子串 阅读详情

最近做热敏打印机功能,根据打印协议系统的不断的往打印板发送数据,每次得发送152字节。由于使用的是串口通信,数据量太大的话会导致数据丢失,这样就导致热敏打印机的走纸速度受到很多的限制。而客户需求的速度却大于这个速度,为了解决这个问题只能减少单次发送数据的数据量,观察每次发送的152字节数据发现,这152字节的数据中大部分数据都是0,而且还是连续的一片0。于是想到了写个压缩算法将这些0压缩一下。对于这个算法的源码如下:

 


#include <stdio.h>


/*----------------------------
 * 功能 : 将字符串中自指定的值进行压缩
 *----------------------------
 * 函数 : func
 * 访问 : public
 * 返回 : 压缩后字符串的长度,-1 :参数错误
 *
 * 参数 : src		[i]		需要压缩的字符串
 * 参数 : dst		[o]		压缩后的字符串,分配空间最短为 2 * ((len + 1) / 2) + len / 2,整形除法
 * 参数 : len		[i]		字符串长度
 * 参数 : value		[i]		压缩的值
 */
int encodefunc(const char* src, char* dst, const int len, const char value)
{
	if (NULL == src || NULL == dst || len <= 0)
	{
		printf("erro.\n");
		return -1;
	}

	unsigned char step = 0;//value连在一起的长度
	int cur = 0;//dst赋值到当前的坐标

	//i < len 不能超出压缩范围
	//step 当最后一个字节是要压缩的部分时,需要执行循环else if部分
	for (int i = 0; i < len || step; ++i)
	{
		//当字符串中的值与给定的值一致时,+1
		//判断是否超出指定范围,且值的长度不能超出char型的范围
		if (i < len && value == src[i])
		{
			step++;
		}
		//当字符串中的值与给定的值不一致时,且上一个字符为给定字符时
		else if (step)
		{
			dst[cur++] = step;
			dst[cur++] = src[i - 1];
			if (i < len)
			dst[cur++] = src[i];
			step = 0;
		}
		else
		{
			dst[cur++] = src[i];
		}
	}

	return cur;
}

/*----------------------------
 * 功能 : 将字符串中自指定的值进行解压缩
 *----------------------------
 * 函数 : func
 * 访问 : public
 * 返回 : 解压缩后字符串的长度,-1 :参数错误
 *
 * 参数 : src		[i]		已经压缩的字符串
 * 参数 : dst		[o]		解压缩后的字符串
 * 参数 : len		[i]		字符串长度
 * 参数 : value		[i]		压缩的值
 */
int decodefunc(const char* src, char* dst, const int len, const char value)
{
	if (NULL == src || NULL == dst || len <= 1)
	{
		printf("erro.\n");
		return -1;
	}

	int cur = 0;//dst赋值到当前的坐标

	//每次赋值只赋值给dst为i-1坐标的值,检查i坐标的值是否为给定的值
	for (int i = 1; i <= len; ++i)
	{
		//判断是否超出指定范围
		if (i < len && value == src[i])
		{
			for (int j = 0; j < (unsigned char)src[i - 1]; ++j)
			{
				dst[cur++] = value;
			}
			//这个字符为给定值,如果不++i的话,会导致下次循环中再次写入该值
			++i;
		}
		else
		{
			dst[cur++] = src[i - 1];
		}
	}

	return cur;
}


int main()
{
    unsigned char srcbuf[] = {0, 0, 10, 0, 2, 4, 22, 4, 0, 0, 3, 0, 0, 0, 0};
	unsigned char dstbuf0[100] = {0};
	unsigned char dstbuf1[100] = {0};
	int len;

	printf("size = %ld\n", sizeof(srcbuf)/sizeof(srcbuf[0]));
	len = encodefunc(srcbuf, dstbuf0, sizeof(srcbuf)/sizeof(srcbuf[0]), 0);
	printf("len = %d\n", len);

	len = decodefunc(dstbuf0, dstbuf1, len, 0);
	printf("len = %d\n", len);

	if (len == sizeof(srcbuf)/sizeof(srcbuf[0]))
	{
		for (int i = 0; i < len; ++i)
		{
			printf("%4d", dstbuf1[i]);
			if (srcbuf[i] != dstbuf1[i])
			{
				printf("failed.\n");
				return -1;
			}
		}
		printf("success.\n");
	}

	return 0;

}

 

15.3【数组和结构体编程】在给定的字符串的指定字符前面插入标记字符,若指定字符连续出现则需要把连续的字符压缩为1个字符加出现的次数,指定字符和标记字符均从键盘输入。 【问题描述】小科最近在研究字符串压缩标记问题,他想在给定的字符串的指定字符前面插入标记字符,若指定字符连续出现则需要把连续的字符压缩为1个字符加出现的次数,指定字符和标记字符均从键盘输入。请你帮他解决这个需求吧。 阅读详情

相关推荐

Avalonia跨平台开发入门:从安装到运行第一个应用(Windows/Linux/macOS)

本文详细介绍了Avalonia跨平台开发的基础入门指南,从安装到运行第一个应用的全过程。涵盖Windows、Linux和macOS三大平台的环境配置,特别推荐使用Visual Studio进行开发,并提供常见问题的解决方案,帮助开发者快速上手Avalonia框架。

weixin_28688385的博客 542

常用字符串压缩方法

如果当前字符串加上字符不在字典中,则将当前字符串的编码添加到结果列表中,并将当前字符串加上字符添加到字典中,并为它分配一个新的编码。在`main`函数中,首先指定要压缩的输入字符串,然后通过调用`bwtTransform`函数进行压缩,并打印压缩后的结果。这样可以实现对重复出现的字符串的压缩。首先,我们对原始字符串进行编码并打印编码后的字符串,然后对编码后的字符串进行解码并打印解码后的字符串。它使用变长编码来表示不同的字符,使频率较高的字符使用较短的编码,频率较低的字符使用较长的编码。

不爱运动的跑者 1万+

vue项目基于WebRTC实现一对一音视频通话

vue项目基于WebRTC实现一对一音视频通话。完整代码gitee地址: https://gitee.com/wade-nian/wdn-webrtc.git。

qq_920189602的博客 6648

字符压缩

压缩原理 字符压缩的原理其实很简单,就是找出那些重复出现的字符串,然后用更短的符号代替。这是相似性压缩,识别相似性,比如压缩7个’a’,容易实现。在我们的思维里,还有一种字符串也很有规律,比如"abcdefg",它的每个字符值递增,但是这种字符串的压缩不易实现,因为需要识别很多规则,需要先验知识,并不想我们的思维那么简单。 这里提一下香农定理,这是压缩的极限,就是在保证数据还能还原的情况下,也就是无损压缩,压缩后大小的最小值。比如每个字节的数值概率是 0~255,均匀分布每个数值出现的概率 1/256,如果

m0_65931372的博客 3716

Qt加载百度地图详细流程(附带报错解决方法)

一篇文章看懂Qt如何加载出百度地图......

qq_60018273的博客 1605

Java写项目前的准备工作指南(技术栈选择 环境搭建和工具配置 项目结构设计与模块划分)

在开始编写一个 Java 项目之前,做好充分的准备工作是至关重要的。很多初学者可能在没有清晰规划的情况下就开始编写代码,导致项目开发进度缓慢、结构混乱,甚至最终无法按预期完成。而事实上,项目的成功不仅仅取决于编码能力,还包括项目初期的规划和准备。准备工作是确保项目顺利进行的基础,它包括技术选型、环境搭建、需求分析、团队协作及项目管理等多个方面。通过这些准备,我们可以确保项目的开发不仅高效而且有可维护性,最终能交付出高质量的代码。在项目开发过程中,异常处理是非常关键的一部分。

eternal__day的博客 1188

3种解法 - 实现字符串压缩

使用(临时变量、双指针法、Python库函数)3种解法,实现对字符串的压缩...

具身小站 1万+

Zemax 中的 LED 阵列模型

这些光线是所有光线的子集,用于布局可视化,而不是详细分析。X 和 Y 散度(αx 和 αy)以度为单位,以不同的方式设置为 6 度和 12 度。每个 LED 都以朗伯模式(广角分布)发光,尽管有些 LED 具有内置光学元件,用于更窄或更聚焦的光束。,具体取决于这些类别中使用的半导体材料。LED 阵列由多个发光二极管 (LED) 组成,这些二极管以特定模式或配置排列,以实现均匀照明、更高强度或特定照明特性。如果数据的存在更改为“辐射强度”,则它以弧度为单位显示每个立体角的功率,作为探测器上入射角的函数。

jkh920184196的博客 1595

base64图片字符串压缩到指定大小

【代码】【无标题】

weixin_44134965的博客 653

GNSS-RTK/INS紧组合里,那个‘杆臂改正’到底怎么算?一个公式讲清INS与天线位置的关系

本文深入解析GNSS-RTK/INS紧组合导航系统中的杆臂改正(Lever Arm Correction)原理与实现方法。详细介绍了杆臂效应的物理本质、数学建模及误差扰动分析,揭示了IMU与GNSS天线位置关系的核心公式,并提供了工程实现中的常见误区与验证方法。通过Python代码示例和紧组合量测模型处理流程,帮助开发者准确理解并应用这一关键技术。

weixin_33137081的博客 357

Vue - 解决报错 Error: Cannot find module ‘XXX\@vue\cli-service\bin\vue-cli-service.js‘(vue项目编译运行出错,启动失败)

vue报错,Error: Cannot find module ‘@vue\cli-service\bin\vue-cli-service.js‘,vue2项目启动报错,vue3项目运行出错,vue执行npm run serve报错,找不到@vue/cli-service模块,vue项目关于:Error: Cannot find module ‘D:\@vue\cli-service\bin\vue-cli-service.js‘的解决方案,vue项目跑不起来了,Vue项目报错,跑项目报错Cannot fi

🏆 前端领域优质创作者 3115

python 压缩文件搜索_利用python编程,在多个打包压缩的文件中搜索指定字符串。有很多xml文件...

展开全部ziprar.py__author__='williezh'#!/usr/bin/envpython3importosimportsysimporttimeimportshutilimportzipfilefromzipfileimportZIP_DEFLATED#Zip文件32313133353236313431303231363533e4b893e5b19e313...

weixin_42513215的博客 328

TriCore架构-基于TC397的启动流程

TC397芯片的启动流程分为三个关键阶段:固件启动(BootFirmware)、Bootloader引导和应用程序启动。BootFirmware作为硬件信任根,包含SSW基础初始化、CHSW自检和BSL应急刷写通道。Bootloader承担安全验证和程序引导功能,支持双分区(AB-SWAP)和双引导方案(PBL/SBL)。安全启动通过校验机制确保软件完整性,提供三种可选技术方案。应用程序启动阶段实现软件双分区管理,支持SOTA更新。整个流程体现了汽车电子系统的安全设计理念,通过硬件级保护与软件验证相结合确保

xiandang8023的博客 987

[特殊字符] Java 实现图片压缩到指定大小(目标KB)

如何压缩图片到目标 KB 大小;如何保持较高图像质量;如何避免压缩死循环;如何测试验证效果;希望能帮助你在文件上传、微信分享、后台图像存储等场景中轻松处理图片压缩任务。如果你有更多需求(批量压缩、异步处理、多线程优化、压缩进度提示等),欢迎留言讨论,我会持续更新与优化。

weixin_44540088的博客 978

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

将任意长度的字符串压缩为指定长度的数字字符串的方式

最近在开发中遇到了一个需求,要求打印一个单据,并且需要有一个16位长度的数字码,要求数字码不能重复,且重复打印生成的单据数字码相同 大家有需要可以参考下面的代码 public static String getMD5(String sourceStr) { byte[] source = sourceStr.getBytes(StandardCharsets.UTF_8); String s = null; char hexDigits[] = { '0',

m0_48324758的博客 2694

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

base64图片字符串获取指定压缩图片后的文件流

/** * @Author mxf * @Description 获取指定压缩图片后的文件流 * @Date 2021/7/29 14:39 * @Param [baseImg64, scale, outputQuality] base64字节,scale:指定图片的大小,值在0到1之间,1f就是原图大小,0.5就是原图的一半大小,这里的大小是指图片的长宽。 * outputQuality:图片的质量,值也是在0.

x948130516的博客 245

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

qstring 删除指定字符_一文看懂linux tr命令--替换、压缩和删除

概述今天主要分享一个tr命令,这个命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。语法tr(选项)(参数)选项:-c或——complerment:取代所有不属于第一字符集的字符;-d或——delete:删除所有属于第一字符集的字符;-s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;-t或--tru...

weixin_39861734的博客 739

java压缩gz指定编码_使用游长编码对字符串压缩 Run Length编码示例

例:Helloooooo => He2l6o/*** Run-Length编码(游长编码)* @author will**/public class RunLengthEncoder {public static void main(String[] args) {String input = "0";System.out.println("Original String Length: "...

weixin_29047545的博客 161

java压缩字符串以后乱码

Java中压缩字符串后乱码问题解决 在Java编程中,我们经常需要对字符串进行压缩以减小存储空间或传输数据时的大小。常见的压缩算法有Gzip、Deflate等。然而,有时候在压缩后解压缩时会出现乱码的情况,这给我们的程序带来了一定的困扰。本文将介绍在Java中压缩字符串后乱码问题的解决方案。 问题描述 当我们使用Java的...

weixin_41405416的博客 1244

ttf字体压缩,抽取指定字符串,减少字体包大小

1.创建font.css,引入需要用到的字体,定义好font-famaily,并在下方定义好需要用到的id名,方便后面改变字体直接使用。三、终端输入命令,提取需要的字体。

u010227042的博客 1544

LeetCode题解(1531):行程长度编码压缩字符串删去指定数量字符后的最短长度(Python)

题目:原题链接(困难) 标签:字符串、动态规划、动态规划-状态表格 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(S2×K)O(S^2×K)O(S2×K) O(S×K)O(S×K)O(S×K) 708ms (95.24%) Ans 2 (Python) Ans 3 (Python) 解法一(动态规划): class Solution: def getLengthOfOptimalCompression(self, s: str, k

长行 1402

LeetCode题解(面试01.06):依据指定规则压缩字符串(Python)

题目:原题链接(简单) 标签:字符串 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(N)O(N)O(N) O(N)O(N)O(N) 64ms (55.70%) Ans 2 (Python) Ans 3 (Python) 解法一: class Solution: def compressString(self, S: str) -> str: if not S: return S

长行 393

根据URL下载文件,将图片等比例压缩(可指定宽高),按原图压缩,根据指定分隔符取字符串,将文本信息追加到指定文本

   public static void ImgSource(string source, string table, int id)         {             //原图片路径             string type = "";             string ImgType = "";             switch (table)  

ceocyo的专栏 798

用Java实现Huffman编码进行文本文件压缩和解压缩,要求如下。 ①采用散列/树映射,统计文本文件中字符使用频率,以字符为单位进行编码。 ②指定字符集合和权值集合创建一棵Huffman树,获...

实现步骤如下: 统计文本文件中字符的使用频率,可以使用散列或树映射的方法。 使用字符集合和对应的权值集合创建一棵Huffman树。 获取每个字符的Huffman编码,并用多个二进制位表示一个Huffman编码。 对文本文件进行压缩,用Huffman编码对文件中的字符进行编码。 解压缩,对二进制位文件进行译码,使用Huffman编码对其进行译码,从而获得原文件。 ...

weixin_35756373的博客 258

[C语言]压缩字符串并添加标记字符

[C语言]压缩字符串并添加标记字符

皮埃尔的博客 385
上一篇: 点阵字体的旋转
下一篇: 使用命名管道实现单机双人聊天
Aiden@semidrive
博客等级 码龄14年 110粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值