C++中char和unsigned char范围的转换

如何解决unsigned char * 到 const char *的转换
[问题点数:60分,结帖人spiker_h]
本版专家分:20
结帖率 100%
CSDN今日推荐
本版专家分:11329
2000年 总版技术专家分年内排行榜第一
2000年11月 总版技术专家分月排行榜第一2000年10月 总版技术专家分月排行榜第一
2001年2月 Web 开发大版内专家分月排行榜第一2000年11月 Web 开发大版内专家分月排行榜第一2000年10月 Web 开发大版内专家分月排行榜第一2000年11月 VC/MFC大版内专家分月排行榜第一2000年10月 VC/MFC大版内专家分月排行榜第一2000年11月 VB大版内专家分月排行榜第一2000年10月 VB大版内专家分月排行榜第一
2000年12月 Web 开发大版内专家分月排行榜第二
本版专家分:20
本版专家分:9719
2000年7月 VC/MFC大版内专家分月排行榜第一
2000年4月 VC/MFC大版内专家分月排行榜第二
2000年8月 VC/MFC大版内专家分月排行榜第三
本版专家分:2233
本版专家分:2167
本版专家分:20
本版专家分:20
本版专家分:1603
2006年8月 硬件/嵌入开发大版内专家分月排行榜第二
本版专家分:20
匿名用户不能发表回复!|
其他相关推荐C语言char*字符串数组和unsigned char[]数组的相互转换
#include &iostream&
#include &string&
void convertUnCharToStr(char* str, unsigned char* UnChar, int ucLen)
int i = 0;
for(i = 0; i & ucL i++)
//格式化输str,每unsigned char 转换字符占两位置%x写输%X写输
sprintf(str + i * 2, "%02x", UnChar[i]);
void convertStrToUnChar(char* str, unsigned char* UnChar)
int i = strlen(str), j = 0, counter = 0;
char c[2];
unsigned int bytes[2];
for (j = 0; j & j += 2)
if(0 == j % 2)
c[0] = str[j];
c[1] = str[j + 1];
sscanf(c, "%02x" , &bytes[0]);
UnChar[counter] = bytes[0];
counter++;
int main()
unsigned char src[6] = {0x12, 0x32,0x56,0x78,0x90,0xab};
char buffer[20];//维数定义些
convertUnCharToStr(buffer, src, 6);
printf("%s\n", buffer);
unsigned char dst[6];
int len = strlen(buffer);
cout && len &&
convertStrToUnChar(buffer, dst);
int i = 0;
for(i = 0; i & 6; i++)
printf("%x ", dst[i]);
char* char[]及string的区别及相互转换
C语言中 unsigned char 与 signed char
不同输出格式一些认识
char与signed char, unsigned char的区别?
char 和 unsigned 与int 之间的转换
有关c语言数据类型转换之char,unsigned char,unsigned short
C语言unsigned char、char与int之间的转换
该使用char还是unsigned char
char和unsigned char强制转换成int后的差异
C语言中unsigned char* 与char*的区别?
没有更多推荐了,下次自动登录
现在的位置:
& 综合 & 正文
C++之char , signed char , unsigned char(转)
ANSI C 提供了3种字符类型,分别是char、signed char、unsigned char.而不是像short、int一样只有两种(int默认就是unsigned int).
三者都占1个字节(1 byte),因此:
signed char取值范围是 -128 到 127(有符号位)
unsigned char 取值范围是 0 到 255
这个大家都很清楚!!
但是char 呢?范围是多少?
答案是:不一定!!!
我们先看一下大师们怎么说的:
(Thinking in C++ 2nd):
signed is the default and is only char may or may not default to signed. By specifying signed char, you force the sign bit to be used.
译文:有符号类型是默认(指的是对于其他整型如int等来说)的类型并且仅对于char来说才是必须的。char有可能是signed也有可能是unsigned(我想这可能取决于编译器的具体实现)。但通过显式地指定一个char为signed,你就迫使其成为有符号的字符型。
我的看法是:
我们首先从这些类型的用处开始想起!
char是用来声明字符的!
而signed char和unsigned char是用来声明数值的,和int与unsigned int一样,只是其占据的空间少(这在手机等空间有限的嵌入式系统中尤其有效!),表示的范围有限。
那么char在各个编译器中是怎样实现的?
c标准中对此是 Impementation Defined,就是未明确定义,由具体的编译器明确定义。
但是一般都是用signed char或unsigned char来实现char的,因为这三种类型的对象在存储介质中的表现形式是一样的(都是一个占8bit的01串,只是解析的时候不同)。
至于到底是signed char还是unsigned char,各个编译器不同!!VC编译器、x86上的GCC都把char定义为signed char,而arm-linux-gcc却把char定义为 unsigned char.
这样一来,在代码移植(困扰我们程序员的一个问题)上就会出现问题,举个最简单的例子:
char a = 0xb6;
if ( a == 0xb6) puts("hello world !");
在vc 或 x86的gcc 上,都是不会打印出 hello world! 的。
用 arm-linux-gcc 编译,在arm板上,是可以打印出hello world ! 的。
我们再变化一下:
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if ( a == 0xb6) puts("a");
if ( b == 0xb600) puts("b");
if ( c == 0xb6000000) puts("c");
在vc 或 x86的gcc 上,只会打印出 c 。用 arm-linux-gcc 编译,在arm板上,是可以打印出 a 和 c 。是不是发现了什么了呢?
首先,介绍 Integer Promotion(整数提升) 。通俗点说,c在处理整型(char short int)时,都会自动提升为int(如果int范围不够,则提升成 unsigned int)。比如
“a == 0xb6”,首先0xb6会当一个int来处理,变为0x(关于常量,后面还会仔细说明)。a 会提升为int ,假如 char 被定义为有符合的,那么 a 为负数,因为最高位为1,所以 a会提升为 0xffffffb6。假如 char 被定义为无符号的,那么a会提升为 0x
即,在vc 或 x86的gcc 上,(a == 0xb6) 会变为 (0xffffffb6 == 0x) ,而在 arm-linux-gcc 上,变为(0x == 0x)。
对于 short,因为c标准明确规定 不加关键字,就代表有符号数。所以,无论在什么编译器上 b == 0xb600 都会变成 0xffffb600 == 0x 。
对于 int,本身是int,也就不用 Integer Promotion 了,所以
c == 0xb60000 中 ,c不做任何处理,直接从内存中读出来,即
0xb60000 == 0xb60000。
最后,简单说一下常量。用八进制(0开头)或十六进制(0x开头)表示的常量,他们都会当成无符号数处理! 另外 像 char a = 0xb6; 这句就有两个 Implementation Defined,一个是char带不带符号,另外一个是,假如char为有符号, 0xb6 会当int 0x 处理,把这个int 变为 有符号的 char 有溢出,会有问题,0xb6本为正数,赋值到a中却变为负数,具体要怎么处理,c对此也是 Implementation Defined。
转自:https://hi.baidu.com/nicker2010/item/591b02096c17ded6dce5b0eb
【上篇】【下篇】unsigned char [] 和 CString互相转换
C/C++ code12#include &stdio.h&#include &tchar.h&unsigned char [] 转为 CStringC/C++ code123456789unsigned char temp[] = { 0x01, 0xC2, 0x24, 0x80, 0x32, 0x00, 0x00, 0x19, 0x00, 0x00 };TCHAR sz[2] = { 0 };CS
for (int i = 0; i & sizeof(temp) / sizeof(temp[0]); i++){
_stprintf(sz, TEXT("%02X"), temp[i]);
str +=}cout && str &&CString 转为 unsigned char []C/C++ code1234567891011CString str = "01C90000";unsigned char temp2[10];TCHAR sz2[3] = { 0 };int nLen = str.GetLength() / 2;for (int j = 0; j & nL j++){
sz2[0] = str[j * 2];
sz2[1] = str[j * 2 + 1];
_stscanf(sz2, TEXT("%2X"), &temp2[j]);}
没有更多推荐了,新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 7, 距离下一级还需 193 积分
论坛徽章:0
我取出的数据转成16进制一看超过了CHAR的范围127,导致得到的char数据不对
我使用过强制类型转换,没用,请问有什么办法吗?
小富即安, 积分 4153, 距离下一级还需 847 积分
论坛徽章:0
你存的什么类型?
白手起家, 积分 7, 距离下一级还需 193 积分
论坛徽章:0
数据是从卡的序列号..
厂商提供的DLL.返回的是unsigned char*的,但是我需要转换成char *,再转成jstring,返回JAVA
7我用16进制打印过,出来是CC1F7114 ,转换了下分别是 204&&31 113 20第一个字节超过了127,但不知道如何转成CHAR
白手起家, 积分 167, 距离下一级还需 33 积分
论坛徽章:0
都已经越界了还怎么转换啊,自己处理掉吧
论坛徽章:0
……说明这不是标准可显 ASCII 字符串,用 byte 数组吧。
论坛徽章:0
加密都玩儿成这样了?
int 也可以考虑,但是输出成文本就不知道了
白手起家, 积分 7, 距离下一级还需 193 积分
论坛徽章:0
但奇怪的是,为什么他给的DEMO,都能显示呢?
unsigned char Snr[MAX_RF_BUFFER];
m_edit_serial.SetWindowTextEx(Snr,len);& & & &
我看输出也没什么问题啊
富足长乐, 积分 7899, 距离下一级还需 101 积分
论坛徽章:0
原帖由 aiheguozhi 于
10:39 发表
我取出的数据转成16进制一看超过了CHAR的范围127,导致得到的char数据不对
我使用过强制类型转换,没用,请问有什么办法吗?
既然char类型无法保存你的数据,为什么不换一种类型来保存呢,譬如int
白手起家, 积分 7, 距离下一级还需 193 积分
论坛徽章:0
我现在就在用INT
正在尝试,谢谢各位的意见
论坛徽章:0
直接“与”上“0x7f”呗
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处

我要回帖

更多关于 unsigned char i 的文章

 

随机推荐