addvalue.c

  name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-5572165936844014&dt=1194442938015&lmt=1194190197&format=336x280_as&output=html&correlator=1194442937843&url=file%3A%2F%2F%2FC%3A%2FDocuments%2520and%2520Settings%2Flhh1%2F%E6%A1%8C%E9%9D%A2%2FCLanguage.htm&color_bg=FFFFFF&color_text=000000&color_link=000000&color_url=FFFFFF&color_border=FFFFFF&ad_type=text&ga_vid=583001034.1194442938&ga_sid=1194442938&ga_hid=1942779085&flash=9&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="336" scrolling="no" height="280" allowtransparency="allowtransparency"> #include <stdio.h>
#include <stdarg.h>

int add_values(int value, ...)
 {
    va_list argument_ptr;
    int result = 0;

    if (value != 0)
      {
        result += value;
        va_start(argument_ptr, value);

        while ((value = va_arg(argument_ptr, int)) != 0)
          result += value;

        va_end(argument_ptr);
      } 
    return(result);
 }

void main(void)
 {
   printf("Sum of 3 is %d/n", add_values(3, 0));
   printf("Sum of 3 + 5 is %d/n", add_values(3, 5, 0));
   printf("Sum of 3 + 5 + 8 is %d/n", add_values(3, 5, 8, 0));
   printf("Sum of 3 + 5 + 8 + 9 is %d/n", add_values(3, 5, 8 , 9, 0));
 }

### **如何判断缩略图字段的总长度** 在这段代码中,**缩略图字段的总长度**由两部分组成: 1. **版本信息**(固定长度 `RECOGNITION_DATA_MIN_LENGTH`,代码中为 4 字节) 2. **实际缩略图数据**(动态长度 `value.thumb_len`) 因此,**整个缩略图字段的长度**计算公式为: ```c 缩略图字段总长度 = RECOGNITION_DATA_MIN_LENGTH + value.thumb_len ``` --- ### **代码解析** #### **1. 写入字段类型** ```c *p_current = SMART_DATA_RECOGNITION_ATTR_FIELD_LIST_TYPE_VEHICLE_SNAPSHOT; p_current += FIELD_TYPE_LENGTH; // 移动指针到"字段长度"位置 ``` - 写入 **字段类型标识**(如 `0x01` 表示缩略图)。 - `p_current` 指针后移 `FIELD_TYPE_LENGTH`(通常 1 字节)。 #### **2. 预留字段长度位置** ```c unsigned char *p_buf_at_field_length = p_current; p_current += FIELD_LENGTH_LENGTH; // 移动指针到"版本信息"位置 ``` - 记录 **字段长度存储位置**(`p_buf_at_field_length`),稍后回填。 - `p_current` 后移 `FIELD_LENGTH_LENGTH`(通常 4 字节)。 #### **3. 写入版本信息** ```c unsigned char *p_buf_at_vesion_length = p_current; p_current += RECOGNITION_DATA_MIN_LENGTH; // 移动指针到"图片数据"位置 ``` - 记录 **版本信息存储位置**(`p_buf_at_vesion_length`),稍后回填。 - `p_current` 后移 `RECOGNITION_DATA_MIN_LENGTH`(代码中为 4 字节)。 #### **4. 写入缩略图数据** ```c memcpy(p_current, value.thumb, value.thumb_len); p_current += value.thumb_len; // 移动指针到下一字段 ``` - 将原始缩略图数据(`value.thumb`)拷贝到缓冲区。 - `p_current` 后移 `value.thumb_len`(动态长度)。 #### **5. 回填字段长度** ```c *((unsigned int *)p_buf_at_field_length) = htonl(value.thumb_len + RECOGNITION_DATA_MIN_LENGTH); ``` - 计算并写入 **字段总长度**(版本信息 + 图片数据)。 - 使用 `htonl` 转换为网络字节序(大端)。 #### **6. 回填版本信息** ```c unsigned int first_int = (SNAPSHOT_FORMAT_JPG << SNAPSHOT_FORMAT_OFFSET) | (value.thumb_len & 0xffffff); *((unsigned int *)p_buf_at_vesion_length) = htonl(first_int); ``` - 版本信息包含: - **图片格式**(如 `SNAPSHOT_FORMAT_JPG`,存储在高位)。 - **图片数据长度**(低 24 位,`value.thumb_len & 0xffffff`)。 - 使用 `htonl` 转换字节序。 --- ### **如何判断缩略图的长度?** 1. **从协议中解析字段长度** 读取 `p_buf_at_field_length` 处的 4 字节值(需 `ntohl` 转换): ```c uint32_t field_length = ntohl(*((uint32_t *)p_buf_at_field_length)); ``` 2. **计算实际缩略图长度** 减去固定头长度: ```c uint32_t thumb_len = field_length - RECOGNITION_DATA_MIN_LENGTH; ``` 3. **验证一致性** 检查版本信息中的长度是否匹配: ```c uint32_t version_info = ntohl(*((uint32_t *)p_buf_at_vesion_length)); uint32_t version_thumb_len = version_info & 0xFFFFFF; // 取低24位 if (thumb_len != version_thumb_len) { // 错误处理:长度不一致 } ``` --- ### **总结** - **字段总长度** = 版本信息(固定) + 缩略图数据(动态)。 - **写入时**:先预留位置,拷贝数据后回填长度。 - **解析时**:从字段长度中减去固定头,得到实际数据长度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值