2014-10-01 93 views
3

我想通过从互联网上获取信息的脚本在OpenWRT中动态更改SSID wifi网络名称。Busybox awk:如何将String中的每个字符视为整数来执行按位运算?

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

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

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

+0

@EdMorton我很困惑。我可以这样做'awk'BEGIN {c = 7; print和(c,3)}''并且获得'3'和这个'awk'BEGIN {c = 7; print和(c,15)}''和得到'7'。并且'和'在这里列出... https://www.gnu.org/software/gawk/manual/html_node/Bitwise-Functions.html – 2014-10-01 21:36:37

+0

@MarkSetchell是啊你是对的,我从来没有遇到它,没有麻烦检查。感谢您的链接。 – 2014-10-01 22:52:26

+0

@MarkSetchell,当c是一个整数时,它工作正常。但如果c是字符/字符串,它总是会返回0. – 2014-10-02 02:42:53

回答

2

你可以使自己的ord功能这样的 - 从GNUAwk用户指南大量举债 - 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

谢谢!这适用于busybox awk。我简化了ord函数(处理所有0-255个字符)并应用于我的代码中:https://github.com/moontide/Dynamic-SSID-for-OpenWRT/blob/master/cnbeta-mobile-news.sh – 2014-10-02 09:22:24

+0

非常好 - 很高兴为您提供帮助。好主意分享你的代码:-) – 2014-10-02 09:25:46

0

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

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

感谢gawk示例,行为按预期行事,但不幸的是,我无法在我的[TP-Link WR841N无线路由器]中安装gawk(http: //wiki.openwrt.org/toh/tp-link/tl-wr841nd),它总共只有4M闪存(少于1M可用),而OpenWRT中的gawk版本没有'-l'选项。 – 2014-10-02 02:29:05

+0

@刘燕刘研我不知道你的OpenWRT环境,但'perl'也有'ord'和'char' ... – 2014-10-02 06:07:17