
#include<stdioh>
#include <stdlibh>
#include <stringh>
int main(int argv,char argc[]){
char a[20]={0};
char d[20]={0};
if(NULL==argc[1])
return -1;
short c=(short)atoi(argc[1]);
sprintf(a,"高 %d",c>>4);//十进制;
printf("%s",a);
sprintf(a,"低 %d",c&0x0f);
printf("%s",a);
char b=itoa(c>>4,a,2);//二进制
printf("高 %s",a);
b=itoa(c&0x0f,a,2);
printf("低 %s",a);
b=NULL;
system("pause");
return 0;
}
#include<stdioh>
int main (void)
{
int ri,repeat;
int i,n;
int a[8];
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
for(i=0;i<8;i++)
{
a[i]=n%2;
n=n/2;
}
/利用"除2取余,逆序排列"法将n转化成二进制并保存在数组a中,这样a[7]到a[4]就依次为低字节的前四位/
printf("%d,%d,%d,%d,\n",a[7],a[6],a[5],a[4]);
}
}
汉字的第一个字节、和汉字的第二个字节,他们两者之间,并没有可供区分的特征。
只能从读出“最高一位是1”的时候开始计数;
偶数次读出的,就是汉字的第一个字节;
奇数次读出的,就是汉字的第二个字节。
在Windows系统中,获取汉字的机内码一般可以直接获取到正确的,但是在iOS系统中,我发现用常规的方法获取的内码是错误的,因为不同的 *** 作系统对于汉字的编码方式是不一样的
最后找到了一个非常规方法来获取到了汉字的机内码,方法如下:
经过这样会输出类似这样的字符串,
--encode-->%BC%F2%CA%E9<-----
BC和F2就是"简"字的内码,BC即是机内码高字节,F2即是机内码低字节
CA和E9就是"书"字的内码,CA即是机内码高字节,E9即是机内码低字节,
得到相应的正确的汉字机内码之后,即可获得相应的区位码
网络字节序与主机字节序
不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序
最常见的有两种
1. Little endian:将低序字节存储在起始地址
2. Big endian:将高序字节存储在起始地址
LE little-endian
最符合人的思维的字节序
地址低位存储值的低位
地址高位存储值的高位
怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说
低位值小,就应该放在内存地址小的地方,也即内存地址低位
反之,高位值就应该放在内存地址大的地方,也即内存地址高位
BE big-endian
最直观的字节序
地址低位存储值的高位
地址高位存储值的低位
为什么说直观,不要考虑对应关系
只需要把内存地址从左到右按照由低到高的顺序写出
把值按照通常的高位到低位的顺序写出
两者对照,一个字节一个字节的填充进去
例子:在内存中双字0x01020304(DWORD)的存储方式
内存地址
4000 4001 4002 4003
LE 04 03 02 01
BE 01 02 03 04
例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
x86系列CPU都是little-endian的字节序
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、 *** 作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。
为了进行转换 bsd socket提供了转换的函数 有下面四个
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序
在使用little endian的系统中 这些函数会把字节序进行转换
在使用big endian类型的系统中 这些函数会定义成空宏
同样 在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug
注:
1、网络与主机字节转换函数:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
2、不同的CPU上运行不同的 *** 作系统,字节序也是不同的,参见下表。
处理器 *** 作系统 字节排序
Alpha 全部 Little endian
HP-PA NT Little endian
HP-PA UNIX Big endian
Intelx86 全部 Little endian <-----x86系统是小端字节序系统
Motorola680x() 全部 Big endian
MIPS NT Little endian
MIPS UNIX Big endian
PowerPC NT Little endian
PowerPC 非NT Big endian <-----PPC系统是大端字节序系统
RS/6000 UNIX Big endian
SPARC UNIX Big endian
IXP1200 ARM核心 全部 Little endian
字节序是针对具体的基础类型的数据而言的,比如32bit整型 int, long, double float这些
一串字节串本身没有字节序。
你需要从这数据中读出具体的数值时在考虑字节序。比如从中读出int
C#默认IO是小端,我想用大端就可以
byte []a=//你那16个字节
uint i=(a[0]<<24)|(a[0]<<16)|(a[0]<<8)|a[3];
就从a串中间读出一个大端的uint
RGB565
用16个bit表示1个像素,5个bit表示R(红色),6个bit表示G(绿色),5个bit表示B(蓝色),从高位到地位排列如下:
RRRRR GGGGGG BBBBB
根据RGB565的存储方式,即可获得R、G、B分量值。现假设存储某一点像素变量为color,数据类型是short,那么则有
R = color & 0xF800,获取高字节的5bit
G = color & 0x07E0,获取中间6个bit
B = color & 0x001F,获取低字节5个bit
RGB555
用16个bit表示1个像素,其中最高位不用,用X表示,5个bit表示R(红色),5个bit表示G(绿色),5个bit表示B(蓝色),从高位到地位排列如下:
X RRRRR GGGGG BBBBB
根据RGB555的存储方式,即可获得R、G、B分量值。现假设存储某一点像素变量为color,数据类型是short,那么则有
R = color & 0x7C00,获取高字节的5bit
G = color & 0x03E0,获取中间5个bit
B = color & 0x001F,获取低字节5个bit
RGB24
用24个bit表示1个像素,R(红色)、G(绿色)、B(蓝色)都用8个bit表示,从高位到地位排列如下:
RRRRRRRR GGGGGGGG BBBBBBBB
根据RGB24的存储方式,即可获得R、G、B分量值。现假设存储某一点像素变量为color,数据类型是short,那么则有
R = color & 0xFF0000,获取高字节的8bit
G = color & 0x00FF00,获取中间8个bit
B = color & 0x0000FF,获取低字节8个bit
RGB32(RGBA)
用32个bit表示1个像素,R(红色)、G(绿色)、B(蓝色)、A(透明度)都用8个bit表示,,从高位到地位排列如下:
RRRRRRRR GGGGGGGG BBBBBBBB AAAAAAAA
根据RGB32的存储方式,即可获得R、G、B分量值。现假设存储某一点像素变量为color,数据类型是short,那么则有
R = color & 0xFF000000,获取高字节的8bit
G = color & 0x00FF0000,获取中间8个bit
B = color & 0x0000FF00,获取低字节8个bit
1一个字节是8位!你这里没有什么低字节高字节!我想你所指的低字节是:
01000011 不过你的想法是对的,比如 0x1234 (16进制) 34就是低字节
2参照1
30000 0001 1 01 SOH (start of handing) 标题开始
0000 0010 2 02 STX (start of text) 正文开始
0000 0011 3 03 ETX (end of text) 正文结束
0000 0100 4 04 EOT (end of transmission) 传输结束
0000 0101 5 05 ENQ (enquiry) 请求
0000 0110 6 06 ACK (acknowledge) 收到通知
0000 0111 7 07 BEL (bell) 响铃
0000 1000 8 08 BS (backspace) 退格
0000 1001 9 09 HT (horizontal tab) 水平制表符
0000 1010 10 0A LF (NL line feed, new line) 换行键
0000 1011 11 0B VT (vertical tab) 垂直制表符
0000 1100 12 0C FF (NP form feed, new page) 换页键
0000 1101 13 0D CR (carriage return) 回车键
0000 1110 14 0E SO (shift out) 不用切换
0000 1111 15 0F SI (shift in) 启用切换
0001 0000 16 10 DLE (data link escape) 数据链路转义
0001 0001 17 11 DC1 (device control 1) 设备控制1
0001 0010 18 12 DC2 (device control 2) 设备控制2
0001 0011 19 13 DC3 (device control 3) 设备控制3
0001 0100 20 14 DC4 (device control 4) 设备控制4
0001 0101 21 15 NAK (negative acknowledge) 拒绝接收
0001 0110 22 16 SYN (synchronous idle) 同步空闲
0001 0111 23 17 ETB (end of trans block) 传输块结束
0001 1000 24 18 CAN (cancel) 取消
0001 1001 25 19 EM (end of medium) 介质中断
0001 1010 26 1A SUB (substitute) 替补
0001 1011 27 1B ESC (escape) 溢出
0001 1100 28 1C FS (file separator) 文件分割符
0001 1101 29 1D GS (group separator) 分组符
0001 1110 30 1E RS (record separator) 记录分离符
0001 1111 31 1F US (unit separator) 单元分隔符
这里的67是字符串
这里和printf函数的内部处理有关系~!输出的值也不一定是 ? 我特意查看了一下内存,内存里面存的是54 55 也就是你输入的67
以上就是关于C语言,从终端输入一个短整数,以字符形式输出该短整数的高字节和低字节全部的内容,包括:C语言,从终端输入一个短整数,以字符形式输出该短整数的高字节和低字节、C程编程:输入一个正整数n,获得该整数低字节中的前4位,并按示例格式输出。、怎么判读读取出来的是汉字的第几个字节等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)