[问题] 请问C 16进制输出的问题

楼主: lupig (未来和肚子??)   2015-01-22 16:47:34
我从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;
}
作者: MOONRAKER (㊣牛鹤鳗毛人)   2015-01-22 17:48:00
加个mask? & 0x000000ff ?
作者: PkmX (阿猫)   2015-01-22 17:54:00
%hhx
作者: EdisonX (卡卡兽)   2015-01-22 19:40:00
%hhx , unsigned char
楼主: lupig (未来和肚子??)   2015-01-23 10:47:00
我改为%hhx后,输出变ff80,只要大于80 前面都会多加ff,请高手们 有没有做法可以提供 感谢
作者: LPH66 (-6.2598534e+18f)   2015-01-23 11:00:00
就 1F 提的方法
作者: anyoiuo   2015-01-23 14:37:00
sprintf(tmpCaStr,"%02x", (unsigned char)baData[iLen])原因是因为%02x输出时, char to int最LSB被当符号位元
作者: TobyH4cker (Toby (我要当好人))   2015-01-24 23:02:00
喔喔喔喔喔对 0x80第一位变成1了所以最好的解决办法就是改用unsigned char宣告这样遇到0x80~0xFF时,才不会把它当成signed来处理

Links booklink

Contact Us: admin [ a t ] ucptt.com