C 为什么fprintf打印额外的值

C 为什么fprintf打印额外的值,c,file-io,printf,C,File Io,Printf,我想对包含字段号和导线类型的标记进行编码,以用于协议缓冲区。我现在遇到的问题是,每当我的“tag”值低于“8”时,fprintf就会在正确的值旁边写入额外的值。i、 e.它打印的不是38,而是38C03。如果tag的值为8或更高,脚本工作正常。下面是省略了不相关行的代码 int uint32_pack (uint8_t *fieldnumber, uint32_t value, uint8_t *out); int main(){ uint32_t initvalue = 2; int re

我想对包含字段号和导线类型的标记进行编码,以用于协议缓冲区。我现在遇到的问题是,每当我的“tag”值低于“8”时,fprintf就会在正确的值旁边写入额外的值。i、 e.它打印的不是38,而是38C03。如果tag的值为8或更高,脚本工作正常。下面是省略了不相关行的代码

int uint32_pack (uint8_t *fieldnumber, uint32_t value, uint8_t *out);

int main(){

uint32_t initvalue = 2;
int return_rv;
uint8_t *tag = (uint8_t *) malloc(sizeof(uint8_t));    
uint8_t *tempout= (uint8_t *) malloc(sizeof(uint32_t));
*tag = 7; //value to be encoded (won't work for values less than 8)

return_rv = uint32_pack (tag, initvalue, tempout);

free(tempout);

    }

/* === pack() === */
/* Pack an unsigned 32-bit integer in base-128 encoding, and return the number
 of bytes needed: this will be 5 or less. */

int uint32_pack (uint8_t *fieldnumber, uint32_t value, uint8_t *out)
{
  unsigned rv = 0;
  FILE *wiretypetag;
  int secondaryvalue;

  wiretypetag = fopen("wiretype.txt","w");


    //encodes wire type and the field number
    if (*fieldnumber <16){
       *fieldnumber <<= 3;
       fprintf(wiretypetag,"%x",fieldnumber[0]);
       }
    if (*fieldnumber < 32 && *fieldnumber > 15){
       *fieldnumber <<= 3;
       secondaryvalue = 0x01;
       fprintf(wiretypetag,"%x %x",fieldnumber[0],secondaryvalue);
           }
    if (*fieldnumber < 48 && *fieldnumber > 31){
        *fieldnumber += 0x10;
        *fieldnumber &= 0x1F;
        *fieldnumber <<= 3;
        secondaryvalue = 0x02;
        fprintf(wiretypetag,"%x %x",fieldnumber[0], secondaryvalue);
        }       
    if (*fieldnumber < 64 && *fieldnumber > 47){
        *fieldnumber &= 0x1F;
        *fieldnumber <<= 3;
        secondaryvalue = 0x03;
        fprintf(wiretypetag,"%x %x",fieldnumber[0], secondaryvalue);
        }       

  /* assert: value<128 */   
    out[rv++] = value;


    if (rv == 1){         
           fprintf(outfile,"%x",out[0]);
           }
    if (rv == 2){
           fprintf(outfile,"%x %x",out[0], out[1]);
           }    
    if (rv == 3){
           fprintf(outfile,"%x %x %x",out[0],out[1],out[2]);
           }
    if (rv == 4){
           fprintf(outfile,"%x %x %x %x",out[0],out[1],out[2],out[3]);
           }
    if (rv == 5){
           fprintf(outfile,"%x %x %x %x %x",out[0],out[1],out[2],out[3],out[4]);
           }

    fclose(wiretypetag);

    return rv;
}
int-uint32\u-pack(uint8\u-t*字段号、uint32\u-t值、uint8\u-t*out);
int main(){
uint32_t initvalue=2;
int返回_rv;
uint8_t*标记=(uint8_t*)malloc(sizeof(uint8_t));
uint8_t*tempout=(uint8_t*)malloc(sizeof(uint32_t));
*tag=7;//要编码的值(对于小于8的值无效)
返回=uint32包装(标签、初始值、临时输出);
免费(临时输出);
}
/*==pack()==*/
/*使用base-128编码打包一个无符号32位整数,然后返回数字
所需字节数:这将是5或更少*/
int uint32_块(uint8_t*字段号、uint32_t值、uint8_t*输出)
{
无符号rv=0;
文件*wiretypetag;
int二次值;
wiretypetag=fopen(“wiretype.txt”,“w”);
//对导线类型和字段编号进行编码

if(*fieldnumber
if(fieldnumber
if)(fieldnumber您可以在以下位置使用
else
简化代码:

//encodes wire type and the field number
if (*fieldnumber <16){
   *fieldnumber <<= 3;
   fprintf(wiretypetag,"%d",fieldnumber[0]);
   }
if (*fieldnumber < 32 && *fieldnumber > 15){
   *fieldnumber <<= 3;
也会执行,打印出更多信息

else if
链将通过确保只执行一个备选方案来解决该问题


既然你有:

unsigned rv = 0;

[...]
/* assert: value<128 */   
out[rv++] = value;

if (rv == 1){         
       fprintf(outfile,"%x",out[0]);
       }
无符号rv=0;
[...]

/*assert:value您可以在以下位置使用
else
简化代码:

//encodes wire type and the field number
if (*fieldnumber <16){
   *fieldnumber <<= 3;
   fprintf(wiretypetag,"%d",fieldnumber[0]);
   }
if (*fieldnumber < 32 && *fieldnumber > 15){
   *fieldnumber <<= 3;
也会执行,打印出更多信息

else if
链将通过确保只执行一个备选方案来解决该问题


既然你有:

unsigned rv = 0;

[...]
/* assert: value<128 */   
out[rv++] = value;

if (rv == 1){         
       fprintf(outfile,"%x",out[0]);
       }
无符号rv=0;
[...]

/*assert:valueYou没有在第一个if检查中取消引用fieldnumber..看起来像是打字错误?
if(fieldnumber@Johnkehm很抱歉,当我将其输入textb框时,这是一个错误,而且您在第一行中使用了%d,而不是像其他任何地方一样,故意使用了%x?
fprintf(wiretypetag,“%d”,fieldnumber[0]);
是的,我只是在做一些故障排除,看看这是否是问题。这个问题的答案对将来遇到这个问题的人没有什么意义。投票关闭太本地化了。你在第一个if检查中没有取消对fieldnumber的引用..看起来像是一个打字错误?
if(fieldnumber@Johnkehm很抱歉,当我将其输入文本框时,这是一个错误。您在第一行中使用了%d,而不是像其他任何地方一样,故意使用%x?
fprintf(wiretypetag,“%d”,fieldnumber[0])
是的,我只是在做一些故障排除,看看这是否是问题。这个问题的答案对将来遇到这个问题的人没有什么意义。投票关闭太本地化了。问题得到了解决,所以这不是全部问题。+1不是因为它现在回答了问题,而是在编辑OP之前回答了问题。并且他的问题得到了解决,所以这不是全部问题。+1不是因为它现在回答了问题,而是在OP编辑之前回答了。
if (*fieldnumber < 64 && *fieldnumber > 47){
unsigned rv = 0;

[...]
/* assert: value<128 */   
out[rv++] = value;

if (rv == 1){         
       fprintf(outfile,"%x",out[0]);
       }