作者lupig (未來和肚子??)
看板C_and_CPP
標題[問題] 請問C 16進制輸出的問題
時間Thu Jan 22 16:47:34 2015
我從Rs232接口讀出一串16進制資料
如我下面程式中的 baData[]
我要直接取baData[]中的值 不須轉什麼進制
我用 sprintf(tmpCaStr,"%02x",baData[iLen]); 來取出
但是讀到bsData[11] = 0x80 的時候資料變成了 ffffff80
請問我要怎麼做才能將80讀出呢?
#include <string.h>
#include <stdio.h>
#include <math.h>
#include "float.h"
int main()
{
char caString1[100];
char caString2[100];
char tmpCaStr[100];
char tmpCaStr1[100];
char tmpCaStr2[100];
char tmpstr[10];
int iLen;
char baData[16];
baData[0] = 0x00;
baData[1] = 0x01;
baData[2] = 0x02;
baData[3] = 0x03;
baData[4] = 0x04;
baData[5] = 0x05;
baData[6] = 0x06;
baData[7] = 0x07;
baData[8] = 0x08;
baData[9] = 0x09;
baData[10] = 0x10;
baData[11] = 0x80;
baData[12] = 0x50;
baData[13] = 0x81;
baData[14] = 0x21;
baData[15] = 0x61;
memset(tmpCaStr,0x00,sizeof(tmpCaStr)); //清空tmpCaStr的資料
memset(caString2,0x00,sizeof(caString2)); //清空caString2的資料
memset(tmpCaStr2,0x00,sizeof(tmpCaStr2)); //清空tmpCaStr2的資料
for(iLen=10;iLen<=15;iLen++)
{
memset(tmpCaStr2,0x00
,sizeof(tmpCaStr2));//清空tmpcaStr2的資料
memset(tmpCaStr,0x00,sizeof(tmpCaStr)); //清空tmpcaStr2的資料
sprintf(tmpCaStr,"%02x",baData[iLen]);
printf("...%s\n", tmpCaStr);
strcat(caString2,tmpCaStr);
}
return 0;
}
--
Sent from my Android
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.137.146.178
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1421916456.A.0D0.html
→ MOONRAKER: 加個mask? & 0x000000ff ? 01/22 17:48
→ PkmX: %hhx 01/22 17:54
→ EdisonX: %hhx , unsigned char 01/22 19:40
→ lupig: 我改為%hhx後,輸出變ff80,只要大於80 前面都會多加ff,請 01/23 10:47
→ lupig: 高手們 有沒有做法可以提供 感謝 01/23 10:48
推 LPH66: 就 1F 提的方法 01/23 11:00
→ anyoiuo: sprintf(tmpCaStr,"%02x", (unsigned char)baData[iLen]) 01/23 14:37
→ anyoiuo: 原因是因為%02x輸出時, char to int最LSB被當符號位元 01/23 14:40
→ TobyH4cker: 喔喔喔喔喔對 0x80第一位變成1了 01/24 23:02
→ TobyH4cker: 所以最好的解決辦法就是改用unsigned char宣告 01/24 23:03
→ TobyH4cker: 這樣遇到0x80~0xFF時,才不會把它當成signed來處理 01/24 23:04