int,byte,short、char之间是怎么相互转换的,只求如何计算(动笔就可算的,不是程序哦)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了int,byte,short、char之间是怎么相互转换的,只求如何计算(动笔就可算的,不是程序哦)相关的知识,希望对你有一定的参考价值。

参考技术A Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换
Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型
在Qt下怎样将QString转char*呢,需要用到QByteArray类,QByteArray类的说明详见Qt帮助文档。
因为char*最后都有一个‘/0’作为结束符,而采用QString::toLatin1()时会在字符串后面加上‘/0’
方法如下:
Qstring str;
char* ch;
QByteArray ba = str.toLatin1();
ch=ba.data();
这样就完成了QString向char*的转化。经测试程序运行时不会出现bug
注意第三行,一定要加上,不可以str.toLatin1().data()这样一部完成,可能会出错。

补充:以上方法当QString里不含中文时,没有问题,但是QString内含有中文时,转换为char*就是乱码,采用如下方法解决:
方法1:
添加GBK编码支持:
#include <QTextCodec>
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
然后改变上面的第三行为:QByteArray ba = str.toLoacl8Bit(); toLoacl8Bit支持中文
方法2:
先将QString转为标准库中的string类型,然后将string转为char*,如下:
std::string str = filename.toStdString();
const char* ch = str.c_str();

C# short、string、二进制之间的转换问题。

需求将一个 short 类型整数拆分成两个8位的十六进制数。
如:
将 258 拆分成 (Hi)0x01 和(Lo)0x02 (二进制是 0000 0001 0000 0010)
如果是正数,很好解决,
Hi = 258 /256 (= 1 = 0x01 = 0000 0001)
Lo = 258%256 (= 2 = 0x02 = 0000 0010 )

如果是负数怎么做?
如 -258 要拆分成 (Hi)0xFE 和(Lo)0xFE (二进制是 1111 1110 1111 1110)
由 -258 怎么得到 Hi 和 Lo ,这两个十六进制的数。
注,在程序中,Hi 和 Lo 用 byte 表示,也就是说,我最终要得到
byte Hi = 254 (1111 1110),byte是无符号的
byte Lo = 254 (1111 1110)。

我的一个想法是
先将 -258 转换成 1111 1110 1111 1110 这个字符串,然后再将这个字符串截取成
1111 1110 和 1111 1110 两部分,然后再分别装换成 byte 类型。
问题是,怎么 将 -258 转换成 1111 1110 1111 1110 这个字符串?
我自己找到了一个解决方法:
short n1 = -258;

string s1 = String.Format("0:X", n1);
s1 = s1.PadLeft(4,'0');
string shi = s1.Substring(0, 2);
string slo = s1.Substring(2, 2);

byte hi = byte.Parse(shi, System.Globalization.NumberStyles.HexNumber);
byte lo = byte.Parse(slo, System.Globalization.NumberStyles.HexNumber);

参考技术A -258在计算机内部就是以 1111 1110 1111 1110存储,你只需要用一个循环就可以
for(int i=15;i>=0;--i)
if(1<<i&-258)
putchar('1');
else
putchar('1');
参考技术B short s = -258;
得到字符串:Convert.ToString(s,2);
您的目的可以这样实现:
byte lo = (byte)(s & 0x00FF);
byte hi = (byte)(s >> 8);

欢迎追问。追问

你这方法最精简,再看自己后来补充的方法,简直惨不忍睹……
用您这个方法,其实正数负数都一样的可以解决。
非常感谢。

本回答被提问者采纳

以上是关于int,byte,short、char之间是怎么相互转换的,只求如何计算(动笔就可算的,不是程序哦)的主要内容,如果未能解决你的问题,请参考以下文章

C# short、string、二进制之间的转换问题。

对于char,short和byte类型的运算

char,short ,int ,long,long long,unsigned long long数据范围

char,short ,int ,long,long long,unsigned long long数据范围

char/unsigned char/int/short 存储范围

java 详细介绍short,byte,char三种类型,我分不清