怎么将一个四个字节转为mBuf“0f47”转为十六进制“0x0f,0x47”?

转:TS流的解析 - Fangzhen - 博客园
随笔 - 367, 文章 - 174, 评论 - 98, 引用 - 0
TS即是"Transport Stream"的缩写。他是分包发送的,每一个包长为188字节。在TS流里可以填入很多类型的数据,如视频、音频、自定义信息等。他的包的结构为,包头为4个字节,负载为184个字节(这184个字节不一定都是有效数据,有一些可能为填充数据)。
工作形式: 因为在TS流里可以填入很多种东西,所以有必要有一种机制来确定怎么来标识这些数据。制定TS流标准的机构就规定了一些数据结构来定义。比如: PSI(Program Specific Information)表,所以解析起来就像这样: 先接收一个负载里为PAT的数据包,在整个数据包里找到一个PMT包的ID。然后再接收一个含有PMT的数据包,在这个数据包里找到有关填入数据类型的ID。之后就在接收到的TS包里找含有这个ID的负载内容,这个内容就是填入的信息。根据填入的数据类型的ID的不同,在TS流复合多种信息是可行的。关键就是找到标识的ID号。
现在以一个例子来说明具体的操作:
在开始之前先给出一片实际TS流例子: 0000f32ch: 47 40 00 17 00 00 B0 0D 00 01 C1 00 00 00 01 E0 ; G@....?..?...? 0000f33ch: 20 A2 C3 29 41 FF FF FF FF FF FF FF FF FF FF FF ;& ⒚)A???????????0000f34ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; ????????????????0000f35ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; ????????????????0000f36ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; ????????????????0000f37ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; ????????????????0000f38ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; ????????????????0000f39ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; ????????????????0000f3ach: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; ????????????????0000f3bch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; ????????????????0000f3cch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; ????????????????0000f3dch: FF FF FF FF FF FF FF FF FF FF FF FF 47 40 20 17 ; ????????????G@ .0000f3ech: 00 02 B0 1B 00 01 C1 00 00 E0 21 F0 00 1B E0 21 ; ..?..?.??.?0000f3fch: F0 04 2A 02 7E 1F 03 E0 22 F0 00 5D 16 BD 48&&& ; ?*.~..??].紿
具体的分析就以这个例子来分析。//&Adjust&TS&packet&headervoid&adjust_TS_packet_header(TS_packet_header*&pheader){&&&&unsigned&char&buf[4];&&&&memcpy(buf,&pheader,&4);&&&&pheader-&transport_error_indicator&&&&&&&&=&buf[1]&&&&7;&&&&pheader-&payload_unit_start_indicator&&&&=&buf[1]&&&&6&&&0x01;&&&&pheader-&transport_priority&&&&&&&&&&&&&&&&=&buf[1]&&&&5&&&0x01;&&&&pheader-&PID&&&&&&&&&&&&&&&&&&&&&&&&&&&&=&(buf[1]&&&0x1F)&&&&8&|&buf[2];&&&&pheader-&transport_scrambling_control&&&&=&buf[3]&&&&6;&&&&pheader-&adaption_field_control&&&&&&&&&&&&=&buf[3]&&&&4&&&0x03;&&&&pheader-&continuity_counter&&&&&&&&&&&&&&&&=&buf[3]&&&0x03;}这是一个调整TS流数据包头的函数,这里牵扯到位段调整的问题。现在看一下TS流数据包头的结构的定义:
//&Transport&packet&headertypedef&struct&TS_packet_header{&&&&unsigned&sync_byte&&&&&&&&&&&&&&&&&&&&&&&&:&8;&&&&unsigned&transport_error_indicator&&&&&&&&:&1;&&&&unsigned&payload_unit_start_indicator&&&&:&1;&&&&unsigned&transport_priority&&&&&&&&&&&&&&&&:&1;&&&&unsigned&PID&&&&&&&&&&&&&&&&&&&&&&&&&&&&:&13;&&&&unsigned&transport_scrambling_control&&&&:&2;&&&&unsigned&adaption_field_control&&&&&&&&&&&&:&2;&&&&unsigned&continuity_counter&&&&&&&&&&&&&&&&:&4;}&TS_packet_
下面我们来分析,在ISO/IEC 13818-1里有说明,PAT(Program Association Table)的PID值为0x00,TS包的标识(即sync_byte)为0x47,并且为了确保这个TS包里的数据有效,所以我们一开始查找47 40 00这三组16进制数,为什么这样?具体的奥秘在TS包的结构上,前面已经说了sync_byte固定为0x47。现在往下看transport_error_indicator、payload_unit_start_indicator、transport_priority和PID这四个元素,PID为0x00,这是PAT的标识。transport_error_indicator为0,transport_priority为0。把他们看成是两组8位16进制数就是:40 00。现在看看我们的TS流片断例子,看来正好是47 40 00开头的,一个TS流的头部占据了4个字节。剩下的负载部分的内容由PID来决定,例子看来就是一个PAT表。在这里有个地方需要注意一下,payload_unit_start_indicator为1时,在前4个字节之后会有一个调整字节,它的数值决定了负载内容的具体开始位置。现在看例子中的数据47 40 00 17 00第五个字节是00,说明紧跟着00之后就是具体的负载内容。
下面给出PAT表的结构体://&PAT&table//&Programm&Association&Tabletypedef&struct&TS_PAT{&&&&unsigned&table_id&&&&&&&&&&&&&&&&&&&&&&&&:&8;&&&&unsigned&section_syntax_indicator&&&&&&&&:&1;&&&&unsigned&zero&&&&&&&&&&&&&&&&&&&&&&&&&&&&:&1;&&&&unsigned&reserved_1&&&&&&&&&&&&&&&&&&&&&&&&:&2;&&&&unsigned&section_length&&&&&&&&&&&&&&&&&&&&:&12;&&&&unsigned&transport_stream_id&&&&&&&&&&&&:&16;&&&&unsigned&reserved_2&&&&&&&&&&&&&&&&&&&&&&&&:&2;&&&&unsigned&version_number&&&&&&&&&&&&&&&&&&&&:&5;&&&&unsigned&current_next_indicator&&&&&&&&&&&&:&1;&&&&unsigned&section_number&&&&&&&&&&&&&&&&&&&&:&8;&&&&unsigned&last_section_number&&&&&&&&&&&&:&8;&&&&unsigned&program_number&&&&&&&&&&&&&&&&&&&&:&16;&&&&unsigned&reserved_3&&&&&&&&&&&&&&&&&&&&&&&&:&3;&&&&unsigned&network_PID&&&&&&&&&&&&&&&&&&&&:&13;&&&&unsigned&program_map_PID&&&&&&&&&&&&&&&&:&13;&&&&unsigned&CRC_32&&&&&&&&&&&&&&&&&&&&&&&&&&&&:&32;}&TS_PAT;再给出PAT表字段调整函数://&Adjust&PAT&tablevoid&adjust_PAT_table&(&TS_PAT&*&packet,&char&*&buffer&){&&&&int&n&=&0,&i&=&0;&&&&int&len&=&0;&&&&packet-&table_id&&&&&&&&&&&&&&&&&&&&=&buffer[0];&&&&packet-&section_syntax_indicator&&&&=&buffer[1]&&&&7;&&&&packet-&zero&&&&&&&&&&&&&&&&&&&&&&&&=&buffer[1]&&&&6&&&0x1;&&&&packet-&reserved_1&&&&&&&&&&&&&&&&&&&&=&buffer[1]&&&&4&&&0x3;&&&&packet-&section_length&&&&&&&&&&&&&&&&=&(buffer[1]&&&0x0F)&&&&8&|&buffer[2];&&&&&&&packet-&transport_stream_id&&&&&&&&&&&&=&buffer[3]&&&&8&|&buffer[4];&&&&packet-&reserved_2&&&&&&&&&&&&&&&&&&&&=&buffer[5]&&&&6;&&&&packet-&version_number&&&&&&&&&&&&&&&&=&buffer[5]&&&&1&&&&0x1F;&&&&packet-&current_next_indicator&&&&&&&&=&(buffer[5]&&&&7)&&&&7;&&&&packet-&section_number&&&&&&&&&&&&&&&&=&buffer[6];&&&&packet-&last_section_number&&&&&&&&&&&&=&buffer[7];&&&&//&Get&CRC_32&&&&len&=&3&+&packet-&section_&&&&packet-&CRC_32&&&&&&&&&&&&&&&&&&&&&&&&=&(buffer[len-4]&&&0x000000FF)&&&&24&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&|&(buffer[len-3]&&&0x000000FF)&&&&16&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&|&(buffer[len-2]&&&0x000000FF)&&&&8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&|&(buffer[len-1]&&&0x000000FF);&&&&//&Parse&network_PID&or&program_map_PID&&&&for&(&n&=&0;&n&&&packet-&section_length&-&4;&n&++&)&&&&{&&&&&&&&packet-&program_number&&&&&&&&&&&&=&buffer[8]&&&&8&|&buffer[9];&&&&&&&&packet-&reserved_3&&&&&&&&&&&&&&&&=&buffer[10]&&&&5;&&&&&&&&if&(&packet-&program_number&==&0x0&)&&&&&&&&&&&&packet-&network_PID&=&(buffer[10]&&&&3)&&&&5&|&buffer[11];&&&&&&&&else&&&&&&&&{&&&&&&&&&&&&packet-&program_map_PID&=&(buffer[10]&&&&3)&&&&5&|&buffer[11];&&&&&&&&}&&&&&&&&n&+=&5;&&&&}}通过上面的分析,例子中的数据00 B0 0D 00 01 C1 00 00 00 01 E0 20 A2 C3 29 41就是具体的PAT表的内容,然后根据PAT结构体来具体分析PAT表。但是我们需要注意的是在PAT表里有program_number、network_PID的元素不只有一个,这两个元素是通过循环来确定的。循环的次数通过section_length元素的确定。在这个例子中program_map_PID为20,所以下面来PMT分析时,就是查找47 40 20的开头的TS包。
下面来分析PMT表,先给出PMT(Program Map Table)的结构体://&PMT&table//&Program&Map&Tabletypedef&struct&TS_PMT{&&&&unsigned&table_id&&&&&&&&&&&&&&&&&&&&&&&&:&8;&&&&unsigned&section_syntax_indicator&&&&&&&&:&1;&&&&unsigned&zero&&&&&&&&&&&&&&&&&&&&&&&&&&&&:&1;&&&&unsigned&reserved_1&&&&&&&&&&&&&&&&&&&&&&&&:&2;&&&&unsigned&section_length&&&&&&&&&&&&&&&&&&&&:&12;&&&&unsigned&program_number&&&&&&&&&&&&&&&&&&&&:&16;&&&&unsigned&reserved_2&&&&&&&&&&&&&&&&&&&&&&&&:&2;&&&&unsigned&version_number&&&&&&&&&&&&&&&&&&&&:&5;&&&&unsigned&current_next_indicator&&&&&&&&&&&&:&1;&&&&unsigned&section_number&&&&&&&&&&&&&&&&&&&&:&8;&&&&unsigned&last_section_number&&&&&&&&&&&&:&8;&&&&unsigned&reserved_3&&&&&&&&&&&&&&&&&&&&&&&&:&3;&&&&unsigned&PCR_PID&&&&&&&&&&&&&&&&&&&&&&&&:&13;&&&&unsigned&reserved_4&&&&&&&&&&&&&&&&&&&&&&&&:&4;&&&&unsigned&program_info_length&&&&&&&&&&&&:&12;&&&&&&&unsigned&stream_type&&&&&&&&&&&&&&&&&&&&:&8;&&&&unsigned&reserved_5&&&&&&&&&&&&&&&&&&&&&&&&:&3;&&&&unsigned&elementary_PID&&&&&&&&&&&&&&&&&&&&:&13;&&&&unsigned&reserved_6&&&&&&&&&&&&&&&&&&&&&&&&:&4;&&&&unsigned&ES_info_length&&&&&&&&&&&&&&&&&&&&:&12;&&&&unsigned&CRC_32&&&&&&&&&&&&&&&&&&&&&&&&&&&&:&32;}&TS_PMT;在给出调整字段函数://&Adjust&PMT&tablevoid&adjust_PMT_table&(&TS_PMT&*&packet,&char&*&buffer&){&&&&int&pos&=&12,&len&=&0;&&&&int&i&=&0;&&&&packet-&table_id&&&&&&&&&&&&&&&&&&&&&&&&&&&&=&buffer[0];&&&&packet-&section_syntax_indicator&&&&&&&&&&&&=&buffer[1]&&&&7;&&&&packet-&zero&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&=&buffer[1]&&&&6;&&&&packet-&reserved_1&&&&&&&&&&&&&&&&&&&&&&&&&&&&=&buffer[1]&&&&4;&&&&packet-&section_length&&&&&&&&&&&&&&&&&&&&&&&&=&(buffer[1]&&&0x0F)&&&&8&|&buffer[2];&&&&&&&packet-&program_number&&&&&&&&&&&&&&&&&&&&&&&&=&buffer[3]&&&&8&|&buffer[4];&&&&packet-&reserved_2&&&&&&&&&&&&&&&&&&&&&&&&&&&&=&buffer[5]&&&&6;&&&&packet-&version_number&&&&&&&&&&&&&&&&&&&&&&&&=&buffer[5]&&&&1&&&0x1F;&&&&packet-&current_next_indicator&&&&&&&&&&&&&&&&=&(buffer[5]&&&&7)&&&&7;&&&&packet-&section_number&&&&&&&&&&&&&&&&&&&&&&&&=&buffer[6];&&&&packet-&last_section_number&&&&&&&&&&&&&&&&&&&&=&buffer[7];&&&&packet-&reserved_3&&&&&&&&&&&&&&&&&&&&&&&&&&&&=&buffer[8]&&&&5;&&&&packet-&PCR_PID&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&=&((buffer[8]&&&&8)&|&buffer[9])&&&0x1FFF;&&&&packet-&reserved_4&&&&&&&&&&&&&&&&&&&&&&&&&&&&=&buffer[10]&&&&4;&&&&packet-&program_info_length&&&&&&&&&&&&&&&&&&&&=&(buffer[10]&&&0x0F)&&&&8&|&buffer[11];&&&&//&Get&CRC_32&&&&len&=&packet-&section_length&+&3;&&&&&&&packet-&CRC_32&&&&&&&&&&&&&&&&=&(buffer[len-4]&&&0x000000FF)&&&&24&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&|&(buffer[len-3]&&&0x000000FF)&&&&16&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&|&(buffer[len-2]&&&0x000000FF)&&&&8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&|&(buffer[len-1]&&&0x000000FF);&&&&//&program&info&descriptor&&&&if&(&packet-&program_info_length&!=&0&)&&&&&&&&pos&+=&packet-&program_info_&&&&&&&//&Get&stream&type&and&PID&&&&&&&for&(&;&pos&&=&(packet-&section_length&+&2&)&-&&4;&)&&&&{&&&&&&&&packet-&stream_type&&&&&&&&&&&&&&&&&&&&&&&&&&&&=&buffer[pos];&&&&&&&&packet-&reserved_5&&&&&&&&&&&&&&&&&&&&&&&&&&&&=&buffer[pos+1]&&&&5;&&&&&&&&packet-&elementary_PID&&&&&&&&&&&&&&&&&&&&&&&&=&((buffer[pos+1]&&&&8)&|&buffer[pos+2])&&&0x1FFF;&&&&&&&&packet-&reserved_6&&&&&&&&&&&&&&&&&&&&&&&&&&&&=&buffer[pos+3]&&&&4;&&&&&&&&packet-&ES_info_length&&&&&&&&&&&&&&&&&&&&&&&&=&(buffer[pos+3]&&&0x0F)&&&&8&|&buffer[pos+4];&&&&&&&&//&Store&in&es&&&&&&&&es[i].type&=&packet-&stream_&&&&&&&&es[i].pid&=&packet-&elementary_PID;&&&&&&&&if&(&packet-&ES_info_length&!=&0&)&&&&&&&&{&&&&&&&&&&&&pos&=&pos+5;&&&&&&&&&&&&pos&+=&packet-&ES_info_&&&&&&&&}&&&&&&&&else&&&&&&&&{&&&&&&&&&&&&pos&+=&5;&&&&&&&&}&&&&&&&&i++;&&&&}}TS流可以复合很多的节目的视频和音频,但是解码器是怎么来区分的呢?答案就在PMT表里,如其名节目映射表。他就是来解决这个问题的。现在看PMT结构体里的stream_type、elementary_PID这两个元素,前一个用来确定后一个作为标识PID的内容具体是什么,音频或视频等。还有要注意他们不只有一个,所以他们是通过循环读取来确保所有的值都被读取了,当然循环也是有规定的(具体看调整函数上)。从例子上来看,我们在倒数第三行找到了上面分析来的PMT表的PID为0x20的TS包。然后就可以把数据是用调整函数填入结构中。然后得到具体节目的PID为视频0x21, 音频0x22。
PS. 文章里的PID是用来判断具体TS包是什么包的。分析每个包得到的PID值,都可以复合在TS头部结构体的PID里。如何用C语言更快捷的将一个字节的十六进制数(如fe)转换为八位二进制数,不能拆开这个字节的十六进制数_百度知道
如何用C语言更快捷的将一个字节的十六进制数(如fe)转换为八位二进制数,不能拆开这个字节的十六进制数
何用C语言更快捷的将一个字节的十六进制数(如fe)转换为八位二进制数,不能拆开这个字节的十六进制数。。
提问者采纳
int i = 0;, buf);= 1;for (i = 0; i &n&
a &}printf(& 8; i++){
buf[i] = a & 0x80char a = 0char buf[9] = {0};%s\&lt
运行错误了。。。
这样就对了#include &stdio.h&int main(int argc, char *argv[]){
char a = 0
char buf[9] = {0};
int i = 0;
for (i = 0; i & 8; i++)
buf[i] = '0' + ((a & 0x80)&&7);
printf(&%s\n&, buf);}
嗯嗯,还是你厉害啊,那我想把buf里面的数比如转入另一个数组里面,成为另一个数组里面的八个数{1,1,1,1,1,1,1,1}这样怎么转进去啊。。。C语言刚接触,不会啊
memcpy(buf1, buf2, 8);调用这个函数就可以了,把buf2里的数据拷贝到buf1里去
提问者评价
原来是这样,感谢!
其他类似问题
为您推荐:
其他2条回答
;n&; printf(&quot:%o&#92利用C中的十六进制输入,简单.h&八进制为;int main(){printf(&quot,&a);输入十六进制数;%x&quot!#include&scanf(&),a);stdio,八进制输出的自带命令;return 0:&quot
恩,看错了。将printf(&八进制为:%o\n&,a);替换为printf(&八位二进制为:%8o\n&,a);其中不足八位时,前边以空格代替。sorry,转换为二进制好想用不了自带命令,只能利用循环进行编程。
那先转换为十进制的,有木有自带命令啊
有啊C中利用printf()中的%d输出格式为输出十进制数,%o为八进制数,%x为十六进,将格式符号同样可用于scanf()输入命令,就像上边例子中的程序一样,你可以编程试试。
单片机?这样(unsigned char)(你的数)就是八位了 如果要高八位的话(unsigned char)((你的数)&&8)
十六进制数的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁> 请教怎么将一个字符串两两解析成十六进制值存入一个字节中
请教怎么将一个字符串两两解析成十六进制值存入一个字节中
发布时间: & &
浏览:419 & &
回复:2 & &
悬赏:0.0希赛币
请问如何将一个字符串两两解析成十六进制值存入一个字节中如字符串“4A9000”请问如何将它转换成十六进制数:0x4A, 0x90, 0x00,从而使得这三个能分别存入字节数组中呢?即是 unsigned char ch[3];ch[0] = 0x4A;ch[1] = 0x90;ch[2] = 0x00;
大概是这样的  C/C++ code  int ReadHexStr(const char *szSrc, unsigned char *pucOutput) {
const char *pch = szS
int snChar = 0;
while ( *szSrc != 0 ) {
unsigned char ucV
switch ( *szSrc ) {
case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
case '5' :
case '6' :
case '7' :
case '8' :
case '9' :
ucValue = *szSrc - '0';
case 'A' :
case 'B' :
case 'C' :
case 'D' :
case 'E' :
case 'F' :
ucValue = *szSrc - 'A' + 10;
case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' :
ucValue = *szSrc - 'a' + 10;
assert(false);
nCount = snChar / 2;
if ( snChar++ % 2 == 0 )
pucOutput[nCount] = ucV
pucOutput[nCount] = pucOutput[nCount] && 4 + ucV
nCount = (snChar + 1) / 2;
pucOutput[nCount] = '\0';
}hnu_pclover & &
& & (0)(0)引用
  C/C++ code  int __stdcall CrnHexToByte(LPCSTR lpInBuf, LPBYTE lpOutBuf)
size_t uInL
uInLen = strlen(lpInBuf);
int nResult = 0;
if (uInLen & 2) return nR
for (size_t i = 0; i & uInL i += 2)
// 输出高4位
c = lpInBuf[i];
if (c &= '0' && c &= '9') lpOutBuf[nResult] = (c - '0') && 4;
else if (c &= 'A' && c &= 'F') lpOutBuf[nResult] = (c - 'A' + 10) && 4;
// 输出低4位
c = lpInBuf[i + 1];
if (c &= '0' && c &= '9') lpOutBuf[nResult++] |= (c - '0');
else if (c &= 'A' && c &= 'F') lpOutBuf[nResult++] |= (c - 'A' + 10);
void __fastcall TForm1::Button1Click(TObject *Sender)
char sz[] = &4A9000&;
unsigned char bt[3];
int n = CrnHexToByte(sz, bt);
hnuljy & &
& & (0)(0)引用
本问题标题:
本问题地址:
温馨提示:本问答中心的任何言论仅代表发言者个人的观点,与希赛网立场无关。请对您的言论负责,遵守中华人民共和国有关法律、法规。如果您的言论违反希赛网问答中心的规则,将会被删除。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位.所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12.但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了.于是BCD的0x12被输出成了十进制的18了,求对上述文字解释
BCD是计算机表示十进制的方法,9分别对应21码),表示为十六进制就是0x0~0x9十进制12表示为BCD为(二进制),表示为十六进制就是0X12;小明误以为这是二进制数,所以(二进制)=18(十进制).其实应该是种编码,每四位表示一个数码.
那么 就是说,BCD与2进制是两种并列的方法,且BCD中4位表示1个数位,那0x是一种表示16进制的固定方法吗,有没有套路,不好意思菜鸟求解释
计算机中只有0和1。在表示数值时计算机用2进制表示,但是人看着不舒服,就用信息量更大的16进制表示,同时16进制和2进制之间的转化非常方便,4位2进制变一位16进制即可。这两种是表示方法,跟编码无关,是最基本的。因为人们日常习惯10进制,所以需要方便的将10进制数表示出来(或者输入),所以需要约定一种表达方式,用四位二进制数表示一位十进制数,这是我们规定的方式。至于0B,0X,0Q,0D等,则是书面上区分不同进制的数而规定的。比如0010,如果是0B0010,那么就等于2,如果是0x0010,就等于16。根据规定,只有十进制时可以省略0d(部分大小写),其他进制不能省。
为您推荐:
其他类似问题
扫描下载二维码}

我要回帖

更多关于 js将图片转为字节流 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信