文章目录
- 一、背景
- 二、去除空格和逗号
- 三、去除`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
位置,所以每次去除的索引位置相比着上一次增加2
。len(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