fprintf не будет правильно записывать в файл шестнадцатеричные числа, заканчивающиеся нулем - PullRequest
2 голосов
/ 21 июля 2011

Я могу записать правильные шестнадцатеричные значения в мой выходной файл всякий раз, когда начальное значение 'tag' является нечетным. Но я хочу записать свой вывод в шестнадцатеричном виде для четных и нечетных начальных значений тегов. Если начальное значение 'tag' четное и превышает число 20, и я пытаюсь записать шестнадцатеричное число в выходной файл, я просто получаю символы ち ㄠ вместо A0 1. Однако, если я изменяю его на запись в десятичном формате Я получаю правильные значения. Если я только записываю fieldnumber [0] в файл вместо обоих fieldnumber [0] и 'virtualvalue', тогда я получаю правильное выходное значение в шестнадцатеричном формате. Кроме того, если я изменю fieldnumber [0] только для записи в виде десятичного вывода и оставлю 'secondvalue' для записи в шестнадцатеричном виде, это даст мне значения записи. Мой код выглядит следующим образом (пропущены несвязанные строки:

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 голосов
/ 22 июля 2011

filednumber [] - это значение long long (8 байт), которое нужно печатать в формате %llx, а не %x, поскольку вы делаете это (проверьте страницу руководства), вам может потребоваться другой выводформатирование, например %lx или %Lx, в зависимости от того, какой компилятор и клик вы используете.

...