Busybox awk:如何将字符串中的每个字符视为整数来执行位操作?
我想通过脚本动态更改wifi网络名称,从互联网上获取信息 因为从internet获取的信息可能包含多个字节字符,所以很容易被截断为无效的UTF-8字节序列,所以我想使用awk(busybox)来修复它。但是,当我尝试对字符串和整数使用按位函数Busybox awk:如何将字符串中的每个字符视为整数来执行位操作?,awk,openwrt,busybox,Awk,Openwrt,Busybox,我想通过脚本动态更改wifi网络名称,从互联网上获取信息 因为从internet获取的信息可能包含多个字节字符,所以很容易被截断为无效的UTF-8字节序列,所以我想使用awk(busybox)来修复它。但是,当我尝试对字符串和整数使用按位函数和时,结果总是返回0 awk 'BEGIN{v="a"; print and(v,0xC0)}' 如何像在C/C++中一样,在awk中将字符串中的字符视为整数字符p[]=“abc”;printf(“%d”,*(p+1)和0xC0)我不知道;我不知道这是否是
和
时,结果总是返回0
awk 'BEGIN{v="a"; print and(v,0xC0)}'
如何像在C/C++中一样,在awk中将字符串中的字符视为整数<代码>字符p[]=“abc”;printf(“%d”,*(p+1)和0xC0)代码>我不知道;我不知道这是否是您的意思,因为您没有提供示例输入和预期输出,但请使用GNU awk了解一下这一点,也许会有所帮助:
$ gawk -lordchr 'BEGIN{v="a"; print v " -> " ord(v) " -> " chr(ord(v))}'
a -> 97 -> a
您可以让自己的
ord
像这样运行-大量借用GNU Awk用户指南-
@埃德蒙顿:我很困惑。我可以做这个
awk'BEGIN{c=7;print and(c,3)}'
和get3
这个awk'BEGIN{c=7;print and(c,15)}'
和get7
。这里列出了和@MarkSetchell是的,你说得对,我从来没有遇到过,也懒得去检查。谢谢你的链接。@MarkSetchell,当c是一个整数时,它工作正常。但是,如果c是一个字符/字符串,它将始终返回0。感谢gawk示例,其行为符合预期,但不幸的是,我无法在总共只有4M闪存的my中安装gawk(可用闪存少于1M),并且OpenWRT中的gawk版本没有-l
选项。@LiuYan刘研 我不知道您的OpenWRT环境,但是perl
也有ord
和char
…谢谢!这适用于busybox awk。我简化了ord函数(处理所有0-255个字符)并将其应用于我的代码中:非常好-很高兴能提供帮助。分享代码的好主意:-)
#!/bin/bash
awk '
BEGIN { _ord_init()
printf("ord(a) = %d\n", ord("a"))
}
function _ord_init( low, high, i, t)
{
low = sprintf("%c", 7) # BEL is ascii 7
if (low == "\a") { # regular ascii
low = 0
high = 127
} else if (sprintf("%c", 128 + 7) == "\a") {
# ascii, mark parity
low = 128
high = 255
} else { # ebcdic(!)
low = 0
high = 255
}
for (i = low; i <= high; i++) {
t = sprintf("%c", i)
_ord_[t] = i
}
}
function ord(str,c)
{
# only first character is of interest
c = substr(str, 1, 1)
return _ord_[c]
}'
ord(a) = 97