fprintf不会正确地将以零结尾的十六进制数字写入文件

时间:2011-07-21 18:14:39

标签: c hex printf

只要'tag'的初始值为奇数,我就可以将正确的十六进制值写入输出文件。但是我想用十六进制来编写我的输出,用于偶数和奇数的初始'tag'值。如果'tag'的初始值是偶数且高于数字20并且我尝试将十六进制数写入输出文件我只得到字符ちㄠ而不是A0 1.但是,如果我将其更改为以十进制格式写入我得到了正确的值。如果我只将fieldnumber [0]写入文件而不是fieldnumber [0]和'secondaryvalue',那么我得到十六进制的正确输出值。另外,如果我改变fieldnumber [0]只写为十进制输出并保留'secondaryvalue'以写为十六进制,它将给我写入值。我的代码如下(省略了不相关的行:

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 = 20; //even number that when processed won't write the correct value

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 *outfile;
  FILE *wiretypetag;
  int secondaryvalue;
  outfile = fopen("hexdata.txt","w");
  wiretypetag = fopen("wiretype.txt","w");


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

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

    fclose(outfile);
    fclose(wiretypetag);

    return rv;
}

1 个答案:

答案 0 :(得分:0)

filednumber []是long long值(8个字节),需要使用格式%llx而不是%x打印(请查看手册页),您可能需要不同的输出格式,例如%lx%Lx,具体取决于您使用的编译器和clib。