NodeCrypto 도움말

문법

내장 스크립트 언어는 깔끔하고 제한된 Python 문법 부분집합을 따른다. 표준 Python에서 의도적으로 제외되었거나 변경된 기능은 Python과의 차이점에 요약되어 있다.

줄 구조와 들여쓰기

식별자와 예약어

리터럴

타입문법
int10진수 255, 16진수 0xFF, 2진수 0b1010. 밑줄 구분자(1_000)를 사용할 수 있으며 음수는 단항 - 연산자로 표현한다.
boolTrue, False
bytes (16진수)h"87 23 af"
bytes (2진 비트열)b"1010 0001"
bytes (UTF-8 텍스트)s"label" (UTF-8로 인코딩된 바이트열)
string"...". 지원 이스케이프: \\, \", \n, \r, \t, \uNNNN. 작은따옴표 문자열은 사용하지 않는다.
string (서식 문자열)f"len={n}" (문자열 포맷팅 참고).
list[e1, e2, ...]. 모든 원소의 타입이 같아야 한다. 빈 리스트는 xs: list[bytes] = []처럼 명시적 타입 표기가 필수이다.

바이트 리터럴

Python과 달리 b"..."는 ASCII 바이트 리터럴이 아니라 2진 비트열 리터럴(0과 1)이다. 16진수 바이트에는 h"..."를, ASCII·UTF-8 텍스트 바이트에는 s"..."를 사용한다.
식결과 (16진수)
h"87 23 af"8723af
b"1000 0111"87
s"0123"30313233
s"0123" == h"30313233"True

소괄호 안에서 인접한 같은 종류의 리터럴은 줄을 넘어 자동으로 이어 붙여지므로, 줄마다 주석을 달아 여러 줄의 키나 테스트 벡터를 깔끔하게 작성할 수 있다:

KEY = (h"00 11 22 33 44 55 66 77"   # first 8 bytes
       h"88 99 aa bb cc dd ee ff")   # last 8 bytes
o = KEY

문장(Statements)

문장 종류형태
대입문x = expr
타입 명시 대입문x: int = expr
복합 대입문x += e (그 외 -= *= //= %= &= |= ^= <<= >>=). x = x op e와 동일하다.
첨자(Subscript) 대입b[i] = v, b[a:c] = part, b[o, n] = part, xs[i] = v (인덱싱과 슬라이싱 참고).
튜플 언패킹a, b = f(x), a, b = b, a
조건문if / elif / else
반복문for x in iterable:
흐름 제어return, break, continue, pass
호출문단독 함수 호출 (예: fail("CODE", "message")).

변수의 정적 타입은 첫 대입 시점에 고정된다. 조건식은 val1 if cond else val2 형태이며 두 분기의 타입이 같아야 한다:

o = "big" if n > 255 else "small"

함수와 상수

HEADER_LEN = 1

def split_head(x: bytes) -> tuple[bytes, bytes]:
    return x[:HEADER_LEN], x[HEADER_LEN:]

first, rest = split_head(b)
size = len(b)

인덱싱과 슬라이싱 (Subscripts)

형태대상결과
b[i]bytes0..255 범위의 단일 바이트 int (음수 인덱스는 뒤에서부터 계산).
b[a:c], b[:c], b[a:], b[:]bytes인덱스 a부터 c 직전까지의 부분 bytes.
b[o, n], b[o,]bytes오프셋과 길이 기준 부분 bytes (n을 생략하면 끝까지).
xs[i], xs[a:c], xs[o, n]list[T]원소 T 또는 부분 리스트 list[T].

Python과 달리 범위를 벗어난 인덱스나 슬라이스는 조용히 잘리지 않고, 0 ≤ start ≤ end ≤ len을 만족하지 않으면 즉시 BYTES_OUT_OF_RANGE(리스트는 SCRIPT_INDEX_OUT_OF_RANGE) 에러가 발생한다. b[o, n]에서 음수 n은 뒤에서부터 센 끝 위치로 동작한다(b[o:n]과 동일).

아래 표에서 a는 00 11 22 33 44 55 66 77 88이다:

식결과 (16진수)
a[1, 3]112233 (오프셋 1부터 3바이트)
a[6,]667788 (오프셋 6부터 끝까지)
a[6, -1]6677 (a[6:-1]과 동일)
a[6, -2]66
a[-3, 3]667788 (음수 오프셋)
a[1:4]112233
a[6:]667788
a[6:-1]6677
a[-1]136 (0x88)

첨자 대입은 바이트 또는 리스트 원소를 제자리에서 갱신한다. 슬라이스 대입 시 우변 bytes의 길이는 대상 슬라이스 길이와 정확히 같아야 한다(다르면 BYTES_LENGTH_MISMATCH 에러 발생):

o = a
o[1, 2] = h"ff ee"

for 반복문과 range

total = 0
for v in b:
    if v == 2:
        continue
    if v == 5:
        break
    total += v

문자열 포맷팅 (f-strings)

f"..."는 식의 값을 string 안에 삽입한다. 포맷 지정자는 [[fill]align][sign][#][0][width][type] 형식을 따른다:

값 타입허용 포맷 타입
intd (기본값), x, X, b, o. 부호(+, -, 공백), #, 0 채움(0)은 int에만 적용된다.
strings (폭, 채움 문자, 정렬).
bytesx (기본값), X (바이트당 2자리 16진수 연속 출력).
bools (True / False).
식결과
f"{n:03d}"007
f"{v:02x}"0a
f"{v:08b}"00000101
f"{v:#x}"0xff
f"{v:#x}"-0xff
f"{v:+d}"+3
f"{name:>8}|{key:X}" ab|0AFF
f"{{{n}}}"{7}

Python과의 차이점

기능PythonNodeCrypto 내장 스크립트
import, class, lambda, 컴프리헨션, try, while, with, global, print지원설계상 제외
속성 접근(.) 및 메서드지원사용하지 않음; 내장 함수(len(x), to_hex(b))를 직접 호출
/, **, 부동소수점 수지원제외 (정수 나눗셈 // 및 모듈러 거듭제곱 pow(b, e, m) 사용)
암묵적 참·거짓 변환(Truthiness)모든 타입에 허용조건식은 반드시 bool 타입이어야 함 (if x & 0x80 != 0:처럼 작성)
바이트 리터럴b"\x87\x23"h"87 23" (16진수), b"1000 0111" (비트열), s"text" (UTF-8)
슬라이스 표기b[1:4]만 지원b[1:4]와 오프셋+길이 표기 b[1, 3] 모두 지원
범위를 벗어난 슬라이스조용히 잘라냄BYTES_OUT_OF_RANGE 에러 발생
bytes 비트 연산 (& | ^ ~ << >>)정의되지 않음바이트 배열 단위 비트 연산 및 시프트 기본 제공
대입 의미론리스트 등 참조 공유순수 값 복사(Value Copy) 의미론