我有一个字符数组,例如:
char bytes[8]={2,0,1,3,0,8,1,9}
我想从下面这个数组中取出前四个字符,并将它们放入一个新的整数变量中。我怎样才能做到这一点?我正在尝试转移它们,但是这种逻辑不起作用。任何的想法?谢谢。
示例:从此数组中得到:年月日
char bytes[8]={2,0,1,3,0,8,1,9}
int year = 2013 ...... month = 8 ............ day = 19
我有一个字符数组,例如:
char bytes[8]={2,0,1,3,0,8,1,9}
我想从下面这个数组中取出前四个字符,并将它们放入一个新的整数变量中。我怎样才能做到这一点?我正在尝试转移它们,但是这种逻辑不起作用。任何的想法?谢谢。
示例:从此数组中得到:年月日
char bytes[8]={2,0,1,3,0,8,1,9}
int year = 2013 ...... month = 8 ............ day = 19
与其用运算符左移<<
(或多或少等同于乘以2^N
),不如乘以10^N
。您可以这样做:
int year = bytes[0] * 1000 +
bytes[1] * 100 +
bytes[2] * 10 +
bytes[3];
int month = bytes[4] * 10 +
bytes[5];
int day = bytes[6] * 10 +
bytes[7];
当然,您可以使用循环使您的代码更具可读性(如有必要)。
enum {
NB_DIGITS_YEAR = 4,
NB_DIGITS_MONTH = 2,
NB_DIGITS_DAY = 2,
DATE_SIZE = NB_DIGITS_YEAR + NB_DIGITS_MONTH + NB_DIGITS_DAY
};
struct Date {
int year, month, day;
};
int getDateElement(char *bytes, int offset, int size) {
int power = 1;
int element = 0;
int i;
for (i = size - 1; i >= 0; i--) {
element += bytes[i + offset] * power;
power *= 10;
}
return element;
}
struct Date getDate(char *bytes) {
struct Date result;
result.year = getDateElement(bytes, 0, NB_DIGITS_YEAR);
result.month = getDateElement(bytes, NB_DIGITS_YEAR, NB_DIGITS_MONTH);
result.day = getDateElement(bytes, NB_DIGITS_YEAR + NB_DIGITS_MONTH, NB_DIGITS_DAY);
return result;
}
使用最后的代码可以更轻松地更改存储在bytes
.
例子:
int main(void) {
char bytes[DATE_SIZE] = {2, 0, 1, 3, 0, 8, 1, 9};
struct Date result = getDate(bytes);
printf("%02d/%02d/%04d\n", result.day, result.month, result.year);
return 0;
}
输出:
19/08/2013
你想要这个吗?
int year = byte[0] * 1000 + byte[1] * 100 + byte[2] * 10 + byte[3];
int mounth = byte[4] * 10 + byte[5];
int day = byte[6] * 10 + byte[7];
注意:这是有效的,因为整数是实际的数字值,而不是数字的字符代码,例如byte[]
index=0 处的值 is 2
but not '2'
。
因此,假设您有一组 char 值,例如:
char bytes[8]={'2', '0', '1', '3', '0', '8', '1', '9'};
然后像这样更改此代码:
#define digit(d) ((d) - ('0'))
int year = digit(byte[0]) * 1000 +
digit(byte[1]) * 100 +
digit(byte[2]) * 10 +
digit(byte[3]);
int mounth = digit(byte[4]) * 10 + digit(byte[5]);
int day = digit(byte[6]) * 10 + digit(byte[7]);
从零开始。添加第一个数字。乘以十。添加第二个数字。乘以十。添加第三个数字。乘以十。添加第四个数字。现在你有一个四位数的整数。
我不熟悉特定的 c 语法,但我可以传达这个想法。将这些字符连接在一起形成一个字符串,然后使用 parseInt 方法(假设 c 有一个)从中获取一个整数。或者,您可以通过乘以 10 的幂来移动字符。例如,给定{2,0,1,3}
:(2 * 10^3) + (0 * 10^2) + (1 * 10^1) + (3 * 10^0)
像这样的东西会起作用:
int month;
int year;
int year = ((int)bytes[0]*1000);
year += (int)bytes[1]*100);
year += ((int)bytes[2] *10);
year += ((int)bytes[3]);
if(sizeof(bytes) == 9){
//month is >10
month = ((int)bytes[4] *10);
month += ((int)bytes[5]);
}
..ETC
这是另一种方法,主要使用标准库中的字符串函数。
我没有测试过这段代码,但它应该给你一个想法。
#include <string.h>
int main (void) {
char bytes[8]={2,0,1,3,0,8,1,9};
char tempstring[8], * end;
unsigned int i, year, month, day;
char zero = "0"; //we need to know the difference between 0 and "0"
for (i = 0; i < 8; i++) {
bytes[i] += (int)zero;
}
//now the numbers are the equivalent characters, but we need to split them out
//and convert them
strncopy(tempstring, bytes, 4);
year = strtoul(tempstring, &end, 10);
strncopy(tempstring , bytes + 4, 2);
month = strtoul(tempstring, &end, 10);
strncopy(tempstring , bytes + 6, 2);
day = strtoul(tempstring, &end, 10);
return 0;
}