在Linux内核如何将char 转换为int?

如何在Linux内核中将char []转换为int

validationinput的文本实际上是一个int?

int procfile_write(struct file *file, const char *buffer, unsigned long count, void *data) { char procfs_buffer[PROCFS_MAX_SIZE]; /* get buffer size */ unsigned long procfs_buffer_size = count; if (procfs_buffer_size > PROCFS_MAX_SIZE ) { procfs_buffer_size = PROCFS_MAX_SIZE; } /* write data to the buffer */ if ( copy_from_user(procfs_buffer, buffer, procfs_buffer_size) ) { return -EFAULT; } int = buffer2int(procfs_buffer, procfs_buffer_size); return procfs_buffer_size; } 

在友好的linux源代码树中的#include <include/linux/kernel.h>中查看kstrtol()的各种版本。

你需要哪一个取决于*buffer是一个用户还是一个内核地址,以及你对缓冲区内容的错误处理/检查的需求有多严格(比如123qx无效或者应该返回123 ?)。

使用atoi和isdigit(注意isdigit只是一个字符)。 http://www.cplusplus.com/reference/clibrary/cctype/isdigit/

由于linux内核中没有很多常用的函数/宏,所以不能使用任何直接函数从字符串缓冲区中获取整型值。

这是我已经使用了很长时间的代码,它可以用于所有* NIX风格(可能没有任何修改)。

这是代码的修改形式,我从开源项目中使用了很长时间(现在不记得名字)。

 #define ISSPACE(c) ((c) == ' ' || ((c) >= '\t' && (c) <= '\r')) #define ISASCII(c) (((c) & ~0x7f) == 0) #define ISUPPER(c) ((c) >= 'A' && (c) <= 'Z') #define ISLOWER(c) ((c) >= 'a' && (c) <= 'z') #define ISALPHA(c) (ISUPPER(c) || ISLOWER(c)) #define ISDIGIT(c) ((c) >= '0' && (c) <= '9') unsigned long mystr_toul ( char* nstr, char** endptr, int base) { #if !(defined(__KERNEL__)) return strtoul (nstr, endptr, base); /* user mode */ #else char* s = nstr; unsigned long acc; unsigned char c; unsigned long cutoff; int neg = 0, any, cutlim; do { c = *s++; } while (ISSPACE(c)); if (c == '-') { neg = 1; c = *s++; } else if (c == '+') c = *s++; if ((base == 0 || base == 16) && c == '0' && (*s == 'x' || *s == 'X')) { c = s[1]; s += 2; base = 16; } if (base == 0) base = c == '0' ? 8 : 10; cutoff = (unsigned long)ULONG_MAX / (unsigned long)base; cutlim = (unsigned long)ULONG_MAX % (unsigned long)base; for (acc = 0, any = 0; ; c = *s++) { if (!ISASCII(c)) break; if (ISDIGIT(c)) c -= '0'; else if (ISALPHA(c)) c -= ISUPPER(c) ? 'A' - 10 : 'a' - 10; else break; if (c >= base) break; if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) any = -1; else { any = 1; acc *= base; acc += c; } } if (any < 0) { acc = INT_MAX; } else if (neg) acc = -acc; if (endptr != 0) *((const char **)endptr) = any ? s - 1 : nstr; return (acc); #endif } 

我使用sscanf()(内核版本)从字符串流中扫描,它在2.6.39-gentoo-r3上工作。 坦率地说,我永远不能得到simple_strtol()在内核中工作 – 我目前正在弄清楚为什么这不起作用在我的盒子上。

  ... memcpy(bufActual, calc_buffer, calc_buffer_size); /* a = simple_strtol(bufActual, NULL, 10); */ // Could not get this to work sscanf(bufActual, "%c%ld", &opr, &a); // places '+' in opr and a=20 for bufActual = "20+\0" ...