[問題] 請問C 16進制輸出的問題

看板C_and_CPP作者 (未來和肚子??)時間9年前 (2015/01/22 16:47), 編輯推噓1(1010)
留言11則, 7人參與, 最新討論串1/1
我從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

01/22 17:48, , 1F
加個mask? & 0x000000ff ?
01/22 17:48, 1F

01/22 17:54, , 2F
%hhx
01/22 17:54, 2F

01/22 19:40, , 3F
%hhx , unsigned char
01/22 19:40, 3F

01/23 10:47, , 4F
我改為%hhx後,輸出變ff80,只要大於80 前面都會多加ff,請
01/23 10:47, 4F

01/23 10:48, , 5F
高手們 有沒有做法可以提供 感謝
01/23 10:48, 5F

01/23 11:00, , 6F
就 1F 提的方法
01/23 11:00, 6F

01/23 14:37, , 7F
sprintf(tmpCaStr,"%02x", (unsigned char)baData[iLen])
01/23 14:37, 7F

01/23 14:40, , 8F
原因是因為%02x輸出時, char to int最LSB被當符號位元
01/23 14:40, 8F

01/24 23:02, , 9F
喔喔喔喔喔對 0x80第一位變成1了
01/24 23:02, 9F

01/24 23:03, , 10F
所以最好的解決辦法就是改用unsigned char宣告
01/24 23:03, 10F

01/24 23:04, , 11F
這樣遇到0x80~0xFF時,才不會把它當成signed來處理
01/24 23:04, 11F
文章代碼(AID): #1KmBae3G (C_and_CPP)