kafka中涉及到序列化,有一個參數是在發送消息實體前邊以一個序列號打頭,
seq = strtoull((prdcfgval+1), NULL, 10);
do_seq = 1;
其中(prdcfgval+1)為讀取配置中該對應參數設置的值,strtoull函數是要把一個字符串轉換成(unsigned)? long long int型的數,第三個參數表示以什么進制,,這兒是十進制;關於strtoull函數的詳細解釋如下:
strtol,strtoll,strtoul, strtoull字符串轉化成數字
名字:
strtol, strtoll, strtoul, strtoull
convert a string to a (signed, unsigned ) long integer string
聲明:
#include<stdlib.h> ( 這個是C標准庫,與linux無關。這套函數是通用的。)
long int strtol(const char *nptr, char **endptr, int base);
long long int strtoll(const char *nptr, char **endptr, int base);
unsigned long int strtoul(const char *nptr, char **endptr, int base);
unsigned long long int strtoull(const char *nptr, char **endptr, int base); ?為啥我man strtoull 沒有unsigned前綴
說明,第一個參數 nptr是要轉化的字符串。第三個參數base說明nptr的進制。base 取值范圍 0,2-36
這幾個函數會忽略nptr前面的空格( ' ', '\t', '\n' '\f', '\v' '\r' ,由isspace判定為真的字符)
while (*nptr && isspace ( *nptr ) ) ++ nptr;
然后遇到非合法字符結束;
base = 2; 合法字符為0, 1
base = 3; 合法字符為0,1, 2
...
base = 11; 合法字符為0,1,...,9,a(A)
...
base = 36;合法字符為0, 1, ...,9,a(A),...,z(Z)。
字符 a-z,是忽略大小寫的,混着來也行,例如 strtol("aA", NULL, 11)依然能得到正確的結果。
函數的第二個參數endptr可以為空,如果不為空,則 endptr 保存函數結束前的那個非合法字符的地址。
如果沒有合法字符,則 *endptr = nptr,函數返回0.
例如:
1.
char *endptr;
char nptr[]="123abc";
int ret = strtol(npstr, &endptr, 10 );
由於10進制里沒有“數字”a,所以掃描到a,結束。
這樣 ret = 123;
endptr = &nptr[3]; ( printf("%s", endptr);將得到字符串 abc )
2.
char nptr[]=" \n\t abc";
int ret = strtol(nptr, &endptr, 10 );
由於函數會忽略nptr前面的空格(' ', '\n'...),所以,從字符a開始掃描,但是遇見的“第一個”即是不合法字符。
所以函數結束。 ret=0; endptr = nptr;
以下的討論,會認為 nptr 前面沒有空格,
即執行過類似於while (*nptr &&isspace ( *nptr ) ) ++ nptr;
如果base 為0.則分3種情況:
如果nptr 以0x(零x)開頭,則把nptr當成16進制處理。
如果npstr以0(零)開頭,則把nptr當成8進制處理。
否則,把nptr當成10進制。
對於函數執行錯誤,如傳了一個非合法base,則errno會設置相關值