int到HEX中的uint8_t,例如存储在uint8_t中的0x07。在C.

时间:2014-07-22 09:25:10

标签: c timestamp int ibeacon uint8t

我正在尝试更改iBeacon的广告,在主要和次要字段中发送时间戳。 在示例代码中,Major和Minor是一个uint8_t,所以为了得到日期,例如我使用它:

uint8_t getConcatTimestamp(){
   time_t rawtime;
   struct tm * timeinfo;
     char *bufferyear;
     char *buffermon;
     char *bufferday;
     char *bufferhour;
     char *buffermin;
     uint8_t segundos=0x10;
   time ( &rawtime );
   timeinfo = localtime ( &rawtime );
   bufferyear = (char *) malloc( sizeof(char) *4);
     buffermon = (char *) malloc( sizeof(char) *4);
     bufferday = (char *) malloc( sizeof(char) *4);
     bufferhour = (char *) malloc( sizeof(char) *4);
     buffermin = (char *) malloc( sizeof(char) *4);

   strftime (bufferyear,4,"%y",timeinfo);
     strftime (buffermon,4,"%m",timeinfo);
   strftime (bufferday,4,"%d",timeinfo);
   strftime (bufferhour,4,"%H",timeinfo);
   strftime (buffermin,4,"%M",timeinfo);
     segundos=(uint8_t)(timeinfo->tm_sec);
    //segundos=0x10;
 //return buffer;
    return(segundos);

}

尽管使用segundos作为0x10它不起作用但我不知道为什么。但是想法是使用例如segundos =(uint8_t)(timeinfo-> tm_sec);因为我假装提取每个16位数据(0x00,2个十六进制数字)以在Major和Minor中使用它们。我尝试使用char *缓冲区使用char字符串,但我发现以后很难从char传递到uint8_t数据,也许更容易使用我可以从提供的结构中获取的int:

struct tm {
   int tm_sec;         /* seconds,  range 0 to 59          */
   int tm_min;         /* minutes, range 0 to 59           */
   int tm_hour;        /* hours, range 0 to 23             */
   int tm_mday;        /* day of the month, range 1 to 31  */
   int tm_mon;         /* month, range 0 to 11             */
   int tm_year;        /* The number of years since 1900   */
   int tm_wday;        /* day of the week, range 0 to 6    */
   int tm_yday;        /* day in the year, range 0 to 365  */
   int tm_isdst;       /* daylight saving time             */   
};

在主要类中使用iBeacon进行广告的无限之处如下:

// Enter main loop.
    for (;;)
    {
            seconds=getConcatTimestamp();
                if(cont<2)
                {   

                    flash_db_t tmp;
                    tmp.data.major_value[0] = clbeacon_info[18] = 0x00;
        tmp.data.major_value[1] = clbeacon_info[19] = 0x01;
        tmp.data.minor_value[0] = clbeacon_info[20] = 0x00;
                    if(cont==0)
                    {
                //tmp.data.minor_value[1] = clbeacon_info[21] = aesstruct.key[0];
                        tmp.data.minor_value[1] = clbeacon_info[21] = seconds;
                    }
                    else
                    {
                    tmp.data.minor_value[1] = clbeacon_info[21] = aesstruct.key[1];
                    }
                    err_code = pstorage_clear(&pstorage_block_id, sizeof(flash_db_t));
        APP_ERROR_CHECK(err_code);

        err_code = pstorage_store(&pstorage_block_id, (uint8_t *)&tmp, sizeof(flash_db_t), 0);
        APP_ERROR_CHECK(err_code);

        err_code = pstorage_access_wait();
        APP_ERROR_CHECK(err_code);
                    advertising_init(beacon_mode_normal);
        s_leds_bit_mask |= BEACON_MODE_LED_MSK;
                    //Solo esto estaba dentro del for(;;)
        app_sched_execute();
        power_manage();







                    cont++;

                }
                else
                    cont=0;
            }
}

是的,我知道Major和Minor是16位,但是当这个iBeacon固件构建时,它使用一个带有2个字段的uint8_t数组,两个字段都有16位。这实际上或多或少是我使用的数据结构:

typedef struct
{
    uint8_t  magic_byte;
    uint8_t  beacon_uuid[16];    
    uint8_t  major_value[2];
    uint8_t  minor_value[2];
    uint8_t  measured_rssi;
}flash_db_layout_t;

这就是为什么我需要数据en uint8_t。我想发送128位,4个包含Minor和Major的完整数据包(32 * 4 = 128位,用AES加密)。但首先我需要发送时间戳才能进行测试。那么,是否有任何示例或片段知道将它们变成字节?但我最终还是不需要uint8_t?因为当我上传固件时,设备无法正常工作,我想这一定是因为数据类型错误

0 个答案:

没有答案