文章目录

  • 一、背景
  • 二、去除空格和逗号
  • 三、去除`0x`字符
  • 3.1、先去除`0`
  • 3.2、先去除`x`
  • 3.3、多次去除`0x`
  • 3.4、补充


一、背景

  在C语言中输入十六进制的数组,如下面的代码,通常是带有逗号,以及0x的十六进制标志。而在CRC计算器中,输入数据进行识别的时候,应该去掉0x,有的时候还要去掉空格以及英文逗号,所以我们需要去除字符串中特定位置的字符。因为上位机是使用Python做的,所以引出本文内容:Python去除字符串中特定衣服或特定位置字符,本文中主要使用了replace函数pop函数

unsigned char test[8] = {0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xFF}

二、去除空格和逗号

Str_Input = self.Input.text()  # 读取输入 
Str_Input = Str_Input.replace(" ", "")  # 去掉空格
Str_Input = Str_Input.replace(",", "")  # 去掉逗号

  去掉空格和逗号的原理是使用replace函数把字符串中的" "及","替换为"",那么如何去除0x呢?

三、去除0x字符

  因为已经去除了空格和逗号,所以后面讨论的内容都是0x120x340x560x780x9A0xBC0xDE0xFF这种形式的,刚开始以为会有0x0x的出现,所以去除0x时不能使用replace函数直接替换0x避免把有效字符去掉;后面想到十六进制只有0-F,不可能有x的,所以是不会出现0x0x这个数,因为有效字符里面不可能包含字符0x。观察输入的规律,发现可以定点敲除。使用pop函数可以敲除字符串里的某一个字符。比如list_Str_Input.pop(1)是去除字符串中的索引为1的字符。观察去除了空格以及逗号留下来的字符串0x120x340x560x780x9A0xBC0xDE0xFF,可以发现每四个里面的后面两个是有效元素,所以我们只需要去除前两个字符即可以去掉0x

  原理:如果只有四个字符,比如’0x12’,有两种方法可以去除’0x’,即是先去除0或者先去除x。

3.1、先去除0

  对于0x12,首先要使用list函数为每一个字符分配一个索引,0对应索引0,x对应索引1,1对应索引2,2对应索3。先去除0之后,0x12变成x12,此时x的位置索引不再是1,而是0。新的索引位置变成了x对应索引0,1对应索引1,2对应索2。所以我们只需要对索引0去除两次即可。

list_Str_Input.pop(0)  # 剔除索引0即是剔除字符0
list_Str_Input.pop(0)  # 第二次剔除索引0是剔除字符x

3.2、先去除x

  先去除x,是去除索引1。去除x之后,’0x12‘变成’012‘,此时0的位置索引依然是0。新的索引位置变成了0对应索引0,1对应索引1,2对应索2。对应的代码是

list_Str_Input.pop(1)  # 剔除索引1即是剔除字符x
list_Str_Input.pop(0)  # 剔除索引0即是剔除字符0

3.3、多次去除0x

  上面输入的只有一个字节,如果是多个字节,比如0x120x340x560x780x9A0xBC0xDE0xFF,对于上面的两种方法无论哪一种都是去除索引0和索引1的字符,只不过是先后顺序有区别。去除0x第一次后,字符串变成120x340x560x780x9A0xBC0xDE0xFF,现在第一个0x索引2索引3位置,去除0x第二次后,字符串变成12340x560x780x9A0xBC0xDE0xFF第一个0x索引4索引5位置,所以每次去除的索引位置相比着上一次增加2len(list_Str_Input) >> 2求出需要循环去除0x的次数i-max,然后3.1和3.2中的索引的位置每次增加2

Str_Input = ' 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xFF'  
Str_Input = Str_Input.replace(" ", "")  # 去掉空格
Str_Input = Str_Input.replace(",", "")  # 去掉逗号
# Str_Input = Str_Input.replace("0x", "") # 去掉0x,可以用,因为输入的十六进制里面不可能包含0x

list_Str_Input = list(Str_Input)  # list为每一个字符分配一个索引
for i in range(0, len(list_Str_Input) >> 2):  # for循环0,2,只循环=0,=1
	# list_Str_Input.pop(1 + 2 * i)  # 先剔除索引1,0x12变成012,在剔除索引0
	# list_Str_Input.pop(0 + 2 * i)
	list_Str_Input.pop(0 + 2 * i)  # 先剔除索引0,0x12变成x12,在剔除索引0即剔除字符x
	list_Str_Input.pop(0 + 2 * i)
list_Str_Output = ''.join(list_Str_Input)  # 合并为字符串

3.4、补充

  因为是不会出现0x0x这个数,所以我们使用replace函数也可以把字符串中的0x去掉,虽然比使用pop函数简单,但是3.1和3.2中的去除字符的方法思路可以使用到其他的地方去。

Str_Input = Str_Input.replace("0x", "") # 去掉0x,可以用,因为输入的十六进制里面不可能包含0x