Как реализовать операцию from_bytes из python на си?

Есть такой код на пайтоне

count = 10
strt = 20
if count == 10:
    return int.from_bytes(data[strt:strt + 8], "big")

Мне нужно сделать тоже самое на си т.е. мне нужно из переменной data прочитать 8 байт по смещению strt в порядке big-endian но у меня вообще нет идей как это сделать. Я очень хотел бы увидеть реализацию самой функции from_bytes на си что-бы понять как она работает.


Ответы (2 шт):

Автор решения: вадим чельник

я бы советовал вам искать по таким запросам: from_bytes source code

(source code это базовая реализация функции) возможно данная ссылка вам поможет https://github.com/python/cpython/blob/main/Objects/longobject.c

→ Ссылка
Автор решения: Stanislav Volodarskiy

В C размер int обычно - четыре байта. Для восьми места не хватит.

Функция from_bytes читает восемь байт и формирует из них число типа uint64_t. Первый байт займёт старшую позицию в числе, последний младшую:

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>

uint64_t from_bytes(const uint8_t bytes[/* 8 */]) {
    uint64_t n = 0;
    for (int i = 0; i < 8; ++i) {
        n = (n << 8) | bytes[i];
    }
    return n;
}

int main() {
    uint8_t bytes[8] = {0, 0, 0, 0, 0, 0, 1, 2};
    uint64_t n = from_bytes(bytes);
    printf("%" PRIu64 "\n", n);
}
$ gcc -std=c11 -pedantic -Wall -Wextra -Werror temp.c

$ ./a.out
258
→ Ссылка