LINUX.ORG.RU

Как преобразовать char* в __u32 и int???


0

0

Вообщем встала необходимость преобразовать строку в виде char *a в тип __u32, в виде 0x00000000. В данном случае необходимо преобразовать строку с ИПом. И в догонку, если есть что то типа char *a = {"666"}, т.е. такая строка, то как его преобразовать в int.

Пы.Сы. На счёт последнего есть мысль, но это как сортировка пузырьком, т.е. в лоб, что не есть хорошо. А как сделать первое даже не знаю поскольку никогда не сталкивался.

Пы.Пы.Сы. просто это требуется для модуля в ядре, может в ядре есть что то для этого?

Заранее спасибо!!!

★★★★★
Ответ на: комментарий от linuxsoft

Дык это вне ядерное, а мне бы то что есть в ядре, ну или на крайняк, как самому реализовать.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

TO human0id:

дык в ядре нельзя пользовать внешние либы.

ТО krum:

ну я так и подумал, просто мало ли, может ещё как можно :)

cyclon ★★★★★
() автор топика
Ответ на: комментарий от krum

>Пусть у нас максимально 3 десятичных разряда, тогда: num=str[0]+str[1]*10+str[2]*100;

так у него фигня выйдет.
надо num = (str[0] - 48) + (str[1] - 48) * 10 + (str[2] - 48) * 100;
и хорошо бы еще проверку делать на 47 < str[x] < 58

Vinill ★★
()

в ядреных сырцах есть файл include/linux/byteorder/generic.h и там есть макросы ntohl ntohs etc.

anonymous
()
Ответ на: комментарий от Vinill

а вообще, все подобные преобразования на уровне ядра не приветствуются (char to int, умножение). там обычно есть только плюс-минус и двоичная логика. делай всю прочую лабуду при загрузке данных для модуля, иначе проблем не оберешься. я когда писал драйвер для bsd (первый раз хрен знает когда), я додумался изза лени чтения документации использовать float на уровне ядра, потом долго думал, почему ядро так нестабильно себя ведет.

Vinill ★★
()
Ответ на: комментарий от Vinill

TO Vinill:

рад бы так сделать, но к сожалению такие преобразования могут быть только там, т.е. их конечно можно вынести но тогда гиморой при обработке введённых данных будет. К тому же преобразования идут только на стадии инициализации данных, ну и при добавлении новых, а работа только с преобразованными типами. Так что пока что только так.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от human0id

ммм, а что в качестве параметров идёт, чёто не понял, т.е. что первое, что второе, что третье.

cyclon ★★★★★
() автор топика

char *a = {"666"}; __u32 b; memcpy(&b,&a,sizeof(a));

ogir
()

а насчет преобразования ip адреса:

int inet_aton(const char *cp, struct in_addr *addr) - Преобразует адрес из точечной записи (строки) в двоичную форму с сетевым порядком следования байтов; возвращает нуль в случае неудачи и ненулевое значение, если адрес допустимый.

ogir
()
Ответ на: комментарий от ogir

Опять же int inet_aton(const char *cp, struct in_addr *addr) нет в ядре, это как бы первое, а второе нужно именно u32. Тут возникла мысль по поводу перевода адреса в u32:

A.B.C.D <----- строка ИП адреса

__u32 rez = (A << 24) | ( B << 16) | (C<<8) | D

что скажете?

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Мой вариант очень даже прокатывает, так что буду юзать этот вариант.

cyclon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.