Busybox awk:如何将字符串中的每个字符视为整数来执行位操作?

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)我不知道;我不知道这是否是

我想通过脚本动态更改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)

我不知道;我不知道这是否是您的意思,因为您没有提供示例输入和预期输出,但请使用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)}'
和get
3
这个
awk'BEGIN{c=7;print and(c,15)}'
和get
7
。这里列出了
@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