#define BASE32_ONIONLEN 16
#define BASE32_ALPHABET "abcdefghijklmnopqrstuvwxyz234567"
void base32_onion(char *dst, unsigned char *src) { // base32-encode hash
uint8_t byte = 0, // dst location
offset = 0; // bit offset
for(; byte < BASE32_ONIONLEN; offset += 5) {
if(offset > 7) {
offset -= 8;
src++;
}
dst[byte++] = BASE32_ALPHABET[(htobe16(*(uint16_t*)src) >> (11-offset))
& (uint16_t)0x001F];
}
dst[byte] = '\0';
}
dst[byte++]
으로 시작하는 부분을 이해하는 데 문제가 있습니다. 저는 파이썬 프로그래머입니다. 모든 타입 변환이 어떻게 작동하는지 정확히 모르겠습니다. src
은 1 바이트를 가리 킵니까? (uint16_t*)
은이를 2 바이트 값의 포인터로 변환합니까? 그래서 그게 바이트를 src
에 두 바이트 값의 시작, 또는 끝을합니까? >> (11-offset)
은 무엇인가요? N 비트만큼 오른쪽으로 시프트 값이 C 함수는 어떻게 작동합니까?
BASE32_ALPHABET은 'abcdefghijklmnopqrstuvwxyz234567' BASE32_ONION 16 – Broseph
가 아닌 주석에 해당하는 정보를 포함하십시오입니다. –
기본적으로'BASE32_ALPHABET'의 새로운 문자열'dst'를 논리에 따라 뒤죽박죽으로 만듭니다. 첫 번째 경우 'offset = 0''byte = 0'을 가져 와서 논리를 살펴보십시오. (당신은'htobe16'의 반환이 필요합니다), 매번 패스 할 때'BASE32_ALPHABET'의 문자/숫자를 선택할 것입니다. –