Swift中如何为字符串添加/移除1字节STX、ETX控制字符
Swift 实现 STX/ETX 控制字符的添加与移除
基础定义
两个控制字符均为单字节ASCII字符,UTF-8编码下固定占1字节,符合字节长度要求:
- STX(文本开始标记):ASCII 编码值
0x02 - ETX(文本结束标记):ASCII 编码值
0x03
字节结构对应参考:
字节流结构:<1B>---<3B>--<1B>-<1B>---<3B>--<1B>
逻辑对应结构:<STX><字符串内容><ETX><STX><字符串内容><ETX>
注:标识中1B代表1字节长度,3B代表3字节长度
功能实现
1. 字符串首尾添加STX/ETX标记
直接通过String扩展实现方法,调用后会在原字符串开头插入1字节STX、末尾插入1字节ETX,不修改原内容:
extension String { func wrappedWithSTXETX() -> String { let stx = String(UnicodeScalar(0x02)) let etx = String(UnicodeScalar(0x03)) return stx + self + etx } }
2. 移除字符串中的STX/ETX控制字符
根据业务场景分两种实现,按需选用:
场景A:清除所有位置的STX/ETX字符
适合处理多段拼接的报文,会过滤掉字符串中任意位置出现的STX、ETX字符,返回纯业务内容:
extension String { func removingAllSTXETX() -> String { let stx = UnicodeScalar(0x02) let etx = UnicodeScalar(0x03) return self.unicodeScalars .filter { $0 != stx && $0 != etx } .map(String.init) .joined() } }
场景B:仅移除首尾配对的STX/ETX标记
适合处理单段独立报文,仅当字符串开头是STX、末尾是ETX时,才会移除首尾两个控制字符;如果首尾标记不匹配,直接返回原字符串,不会误删内容中异常混入的字符:
extension String { func unwrapSTXETX() -> String { let stx = String(UnicodeScalar(0x02)) let etx = String(UnicodeScalar(0x03)) guard hasPrefix(stx), hasSuffix(etx) else { return self } var content = self content.removeFirst() content.removeLast() return content } }
调用示例
// 包裹标记 let rawStr = "test123" let wrappedStr = rawStr.wrappedWithSTXETX() // wrappedStr 总长度比rawStr多2,首尾分别是STX、ETX字符 // 清除所有控制字符 let combinedStr = wrappedStr + wrappedStr // 两段报文拼接 let fullCleaned = combinedStr.removingAllSTXETX() // fullCleaned 输出为 "test123test123",无任何控制字符 // 仅拆首尾标记 let singleUnwrapped = wrappedStr.unwrapSTXETX() // singleUnwrapped 输出为 "test123",和原始内容完全一致
内容的提问来源于stack exchange,提问作者spt025
相关产品推荐
相关产品推荐

