您现在的位置是:主页 > news > 抛丸机网站怎么做/新乡seo顾问
抛丸机网站怎么做/新乡seo顾问
admin2025/6/7 18:10:46【news】
简介抛丸机网站怎么做,新乡seo顾问,网站新闻字体,青浦集团网站建设处理十六进制字符串转换的最简单方法之一是使用 strtoul 及其读取/转换 base-16 的能力 . strtoul 可以与指针一起使用,逐步执行输入字符串,提供每个找到的值的转换,然后只需将指针移动到下一个值的开头即可 . 根据您的输入, strc…
处理十六进制字符串转换的最简单方法之一是使用 strtoul 及其读取/转换 base-16 的能力 . strtoul 可以与指针一起使用,逐步执行输入字符串,提供每个找到的值的转换,然后只需将指针移动到下一个值的开头即可 . 根据您的输入, strchr 用于定位每个 'x' 然后转换后面的2个字符 .
为了帮助完成此过程,您可以编写一个简单的函数来提供转换的所有错误检查和验证 . 像下面这样的东西效果很好:
/** string to unsigned long with error checking */
unsigned long xstrtoul (char *p, char **ep, int base)
{
errno = 0;
unsigned long tmp = strtoul (p, ep, base);
/* Check for various possible errors */
if ((errno == ERANGE && (tmp == ULONG_MAX)) ||
(errno != 0 && tmp == 0)) {
perror ("strtoul");
exit (EXIT_FAILURE);
}
if (*ep == p) {
fprintf (stderr, "No digits were found\n");
exit (EXIT_FAILURE);
}
return tmp;
}
您只需要最少的代码就可以将函数应用于数据文件中的所有行 . 例如:
#include
#include /* for strtol */
#include /* for strchr */
#include /* for INT_MIN/INT_MAX */
#include /* for errno */
#define MAXL 256
unsigned long xstrtoul (char *p, char **ep, int base);
int main (int argc, char **argv)
{
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
char line[MAXL] = {0};
unsigned values[MAXL] = {0};
int base = argc > 2 ? atoi (argv[2]) : 16;
size_t i, idx = 0;
if (!fp) { /* validate file open */
fprintf (stderr, "error: file open failen '%s'.\n", argv[1]);
return 1;
}
/* read each line in file (up to MAXL chars per-line) */
while (fgets (line, MAXL, fp)) {
char *p = line;
char *ep = p;
char digits[3] = {0};
errno = 0;
/* convert each string of digits into number */
while (errno == 0) {
/* skip any non-digit characters */
if (!(p = strchr (p, 'x'))) break;
strncpy (digits, ++p, 2);
digits[2] = 0; /* nul-terminate */
/* convert string to number */
values[idx++] = (unsigned)xstrtoul (digits, &ep, base);
if (errno || idx == MAXL) { /* check for error */
fprintf (stderr, "warning: MAXL values reached.\n");
break;
}
p += 2;
}
}
if (fp != stdin) fclose (fp);
/* print results */
for (i = 0; i < idx; i++)
printf (" values[%2zu] : 0x%02x\n", i, values[i]);
return 0;
}
/** string to unsigned long with error checking */
unsigned long xstrtoul (char *p, char **ep, int base)
{
errno = 0;
unsigned long tmp = strtoul (p, ep, base);
/* Check for various possible errors */
if ((errno == ERANGE && (tmp == ULONG_MAX)) ||
(errno != 0 && tmp == 0)) {
perror ("strtoul");
exit (EXIT_FAILURE);
}
if (*ep == p) {
fprintf (stderr, "No digits were found\n");
exit (EXIT_FAILURE);
}
return tmp;
}
Input Files
$ cat dat/hex3.txt
0x020x000x000x000x000x000x680x000x000x000x020x000x000x000x000x00
Use/Output
$ ./bin/fgets_xstrtoul_simple dat/hex3.txt
values[ 0] : 0x02
values[ 1] : 0x00
values[ 2] : 0x00
values[ 3] : 0x00
values[ 4] : 0x00
values[ 5] : 0x00
values[ 6] : 0x68
values[ 7] : 0x00
values[ 8] : 0x00
values[ 9] : 0x00
values[10] : 0x02
values[11] : 0x00
values[12] : 0x00
values[13] : 0x00
values[14] : 0x00
values[15] : 0x00
仔细看看,如果您有任何疑问,请告诉我 .