2014-10-01 5 views
3

SSID 인터넷에서 정보를 가져 오는 스크립트를 통해 OpenWRT에 동적으로 wifi 네트워크 이름을 변경하고 싶습니다.Busybox awk : 비트 단위 연산을 수행하기 위해 String의 각 문자를 정수로 처리하는 방법은 무엇입니까?

인터넷에서 가져온 정보에 여러 바이트 문자가 포함될 수 있으므로 유효하지 않은 UTF-8 바이트 시퀀스로 쉽게자를 수 있으므로 awk (busybox)를 사용하여 문제를 해결하고 싶습니다. 그러나 문자열과 정수에 비트 단위 함수 and을 사용하려고하면 결과는 항상 0을 반환합니다.

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

C/C++에서와 같이 awk에서 문자열의 문자를 정수로 처리하는 방법은 무엇입니까? 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 –

+0

@MarkSetchell 예, 맞습니다. 확인하기 위해 귀찮게하지 않았다. 링크를 가져 주셔서 감사합니다. –

+0

@MarkSetchell, c가 정수인 경우 잘 작동합니다. 그러나 c가 문자/문자열 인 경우, 항상 0을 반환합니다. –

답변

2

에게 당신을 크게 GNU awk는 사용 설명서에서 차용 - -이 같은 자신의 ord 기능 할 수 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 –

+0

우수 - 도움이되기를 기쁘게 생각합니다. 코드를 공유하는 좋은 아이디어 :-) –

0

I 돈, 당신이 샘플 입력 및 예상 출력을 제공하지만, GNU의 AWK와 이것 좀하지 않았기 때문에 당신이 무슨 뜻인지 t은 알고 어쩌면 도움이됩니다 :

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

gawk 예를 들어 주셔서 감사 드리며, 예상대로 동작하지만 불행히도 gawk를 내 [TP-Link WR841N 무선 라우터]에 설치할 수 없습니다 (http : //wiki.openwrt.org/toh/tp-link/tl-wr841nd) 만 4M 플래시 만 있고 (1M 미만 사용 가능), OpenWRT의 gawk 버전에는'-l' 옵션이 없습니다. –

+0

@LiuYan 刘 研 OpenWRT 환경을 모르지만'perl'도'ord'와'char'를 가지고 있습니다 ... –