gpt4 book ai didi

c - 这个C函数是如何工作的

转载 作者:行者123 更新时间:2023-11-30 17:29:46 25 4
gpt4 key购买 nike

#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++] 开头的部分。我是一名 python 程序员,我不太确定所有类型转换是如何工作的。 src 指向一个字节,对吗?并且 (uint16_t*) 将其转换为指向 2 字节值的指针?那么这是否会使 src 处的字节成为两个字节值的开始或结束? >>(11-offset) 是什么?

最佳答案

uint16_t t1, t2, t3;
uint8_t t4, t5, t6;

t1 = *(uint16_t*)src; // Whatever src is pointing to, treat the next
// 16 bits as an unsigned number
// Safer would be memcpy(&t1, src, sizeof(t1));
t2 = htobe(t1); // Guessing this changes the value to have big-endian
// byte order
t3 = t2 >> (11-offset); // Shift t2 to the right by (11-offset) bits
t4 = t3 & (uint16_t)0x001F; // t4 contains the lower 5 bits of t3
t5 = BASE32_ALPHABET[t4]; // t5 gets the t4-th byte of the base32 alphabet
t6 = byte++; // t6 gets the value of byte, byte's value is then
// incremented, so t6 + 1 == byte
dest[t6] = t5; // t5 is assigned to dest[t6]

将值向右移位 n 位相当于将该值除以 2n

关于c - 这个C函数是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25516260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com