Как реализовать операцию 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
В 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