Busybox awk:如何将String中的每个字符视为整数来执行按位运算?

时间:2014-10-01 20:08:58

标签: awk openwrt busybox

我想通过脚本从SSID动态更改OpenWRT wifi网络名称,该脚本从互联网获取信息。

因为从互联网上获取的信息可能包含多字节字符,所以它很容易被截断为无效的UTF-8字节序列,因此我想使用awk(busybox)来修复它。但是,当我尝试对String和整数使用按位函数and时,结果始终返回0

awk 'BEGIN{v="a"; print and(v,0xC0)}'

如何将字符串中的字符视为awk中的整数,就像在C / C ++中一样? char p[]="abc"; printf ("%d",*(p+1) & 0xC0);

2 个答案:

答案 0 :(得分:2)

您可以制作这样的ord函数 - 大量借用GNU Awk用户指南 - here

#!/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

答案 1 :(得分:0)

我不知道你的意思是不是你的意思,因为你没有提供样本输入和预期的输出,但是用GNU awk看看这个,也许它会帮助:

$ gawk -lordchr 'BEGIN{v="a"; print v " -> " ord(v) " -> " chr(ord(v))}'
a -> 97 -> a