\x和0x的区别
\x
和 0x
分别表示不同进制的数字表示法。
-
\x
:十六进制转义序列在字符常量或字符串中,
\x
用于表示一个十六进制数。后面紧跟着两个十六进制数字,表示一个字节的十六进制值。例如,\x41
表示ASCII码为65的字符 ‘A’。char myChar = '\x41'; // 表示字符 'A'
在其他编程语言或上下文中,
\x
的使用方式可能会有所不同,但它通常表示十六进制转义。 -
0x
:十六进制数表示法在数字常量中,
0x
前缀表示后面的数字是十六进制数。例如,0x1F
表示十进制的31。int myNumber = 0x1F; // 表示十进制的31
这种表示法在很多编程语言中通用,包括C、C++、Java、Python等。
总结:
\x
主要用于字符常量或字符串中的十六进制转义序列。0x
主要用于数字常量中的十六进制数表示法。
func main(){
a:='\x42' // type rune = int32 utf8编码的字符 在go中为rune类型,区别于byte(ascii)
b:=0x42 // 16进制数字
c:="\x42" // 字符串
fmt.Printf("%v %T %v %T %v %T",a,a,b,b,c,c)
}
-------------------------
66 int32 66 int B string 66 int32
range 迭代 string 得到的值
range 得到的索引是字符值(Unicode point / rune)第一个字节的位置,与其他编程语言不同,这个索引并不直接是字符在字符串中的位置。
for range 迭代会尝试将 string 翻译为 UTF8 文本,对任何无效的码点都直接使用 0XFFFD rune(�)UNicode 替代字符来表示。如果 string 中有任何非 UTF8 的数据,应将 string 保存为 byte slice 再进行操作。
data := "A\xfe\x02\xff\x04"
fmt.Println(data) // A�╗�╝
func main() {
data := "A\xfe\x02\xff\x04"
for _, v := range data {
fmt.Printf("%#x ", v) // 0x41 0xfffd 0x2 0xfffd 0x4 // 错误
}
for _, v := range []byte(data) {
fmt.Printf("%#x ", v) // 0x41 0xfe 0x2 0xff 0x4 // 正确
}
}