二进制,十进制,十六进制输出

#include<stdio.h>
#include<string.h>

int
unicode_to_utf( unsigned long unicode, unsigned char *utf )
{
    //assert( utf );

    int size = 0;
    if ( unicode <= 0x7F )
    {
        *( utf + size++ ) = unicode & 0x7F;
    }
    else if ( unicode >= 0x80 && unicode <= 0x7FF )
    {
        *( utf + size++ ) = ( ( unicode >> 6 ) & 0x1F ) | 0xC0;
        *( utf + size++ ) = ( unicode & 0x3F ) | 0x80;
    }
    else if ( unicode >= 0x800 && unicode <= 0xFFFF )
    {
        *( utf + size++ ) = ( ( unicode >> 12 ) & 0x0F ) | 0xE0;
        *( utf + size++ ) = ( ( unicode >> 6  ) & 0x3F ) | 0x80;
        *( utf + size++ ) = ( unicode & 0x3F  ) | 0x80;
    }
    else if ( unicode >= 0x10000 && unicode <= 0x10FFFF )
    {
        *( utf + size++ ) = ( (unicode >> 18 ) & 0x7  ) | 0xF0;
        *( utf + size++ ) = ( (unicode >> 12 ) & 0x3F ) | 0x80;
        *( utf + size++ ) = ( (unicode >> 6  ) & 0x3F ) | 0x80;
        *( utf + size++ ) = ( unicode & 0x3F ) | 0x80;
    }
    else if ( unicode >= 0x200000 && unicode <= 0x3FFFFFF )
    {
        *( utf + size++ ) = ( (unicode >> 24 ) & 0x3  ) | 0xF8;
        *( utf + size++ ) = ( (unicode >> 18 ) & 0x3F ) | 0x80;
        *( utf + size++ ) = ( (unicode >> 12 ) & 0x3F ) | 0x80;
        *( utf + size++ ) = ( (unicode >> 6  ) & 0x3F ) | 0x80;
        *( utf + size++ ) = ( unicode & 0x3F ) | 0x80;
    }
    else if ( unicode >= 0x4000000 && unicode <= 0x7FFFFFFF )
    {
        *( utf + size++ ) = ( (unicode >> 30 ) & 0x1  ) | 0xFC;
        *( utf + size++ ) = ( (unicode >> 24 ) & 0x3F ) | 0x80;
        *( utf + size++ ) = ( (unicode >> 18 ) & 0x3F ) | 0x80;
        *( utf + size++ ) = ( (unicode >> 12 ) & 0x3F ) | 0x80;
        *( utf + size++ ) = ( (unicode >> 6  ) & 0x3F ) | 0x80;
        *( utf + size++ ) = ( unicode & 0x3F ) | 0x80;
    }
    else
    {
        printf( "Error : unknow scope\n" );
        return -1;
    }
    *( utf + size ) = ‘\0‘;

    return size;
}

void
utf_print( unsigned char *utf, int size )
{
    if ( size == -1 )
    {
        printf( "unknow scope\n" );
        return;
    }

    int index = 0;
    for ( ; index < size; index += 1 )
    {
        printf( "%X",  *( utf + index) );
    }

    printf( "\n" );
}

 int
main( int argc, char *argv[] )
{
    unsigned long unicode1 = 55;
    unsigned char utf[7] = { 0 };
    int size = unicode_to_utf( unicode1, utf );
    utf_print( utf, size );

    unsigned long unicode2 = 123;
    size = unicode_to_utf( unicode2, utf );
    utf_print( utf, size );

    memset( utf, 0x00, sizeof( utf ) );
    unsigned long unicode3 = 0x4E25;
    size = unicode_to_utf( unicode3, utf );
    utf_print( utf, size );

    memset( utf, 0x00, sizeof( utf ) );
    unsigned long unicode4 = 23456;
    size = unicode_to_utf( unicode4, utf );
    utf_print( utf, size );

    memset( utf, 0x00, sizeof( utf ) );
    unsigned long unicode5 = 234567;
    size = unicode_to_utf( unicode5, utf );
    utf_print( utf, size );

    memset( utf, 0x00, sizeof( utf ) );
    unsigned long unicode6 = 34561234;
    size = unicode_to_utf( unicode6, utf );
    utf_print( utf, size );

    /* error */
    memset( utf, 0x00, sizeof( utf ) );
    unsigned long unicode7 = 0x8FFFFFFF;
    size = unicode_to_utf( unicode7, utf );
    utf_print( utf, size );

    return 0;
}
[email protected]:/fdsk# gcc -o utf0 utf0.c
[email protected]:/fdsk# ./utf0
37
7B
E4B8A5
E5AEA0
F0B99187
FA83B5B392
Error : unknow scope
unknow scope

原文地址:https://www.cnblogs.com/abc36725612/p/11175726.html

时间: 2024-08-30 15:02:43

二进制,十进制,十六进制输出的相关文章

ASCII码表(二进制 十进制 十六进制)

css里,允许使用转义字符\+ascii16进制形式; 例如: e的ascii 16进制是65,我们就写为\65 expression -> expr\65ssion 二进制 十进制 十六进制 缩写 解释 0000 0000  0 00 NUL 空字符(Null) 0000 0001 1 01 SOH 标题开始 0000 0010 2 02 STX 正文开始 0000 0011 3 03 ETX 正文结束 0000 0100 4 04 EOT 传输结束 0000 0101 5 05 ENQ 请求

[javaSE] 进制转换(二进制十进制十六进制八进制)

十进制转二进制,除2运算 十进制6转二进制是 110  (注意从右往左写,使用算式从下往上写) 二进制转十进制,乘2过程 二进制110转十进制  0*2的0次方+1*2的1次方+1*2的2次方=6 对应关系 0 1 0 1 0 1 32 16 8 4 2 1 把1对应的位置的数加起来就可以了,所以是21 一个字节 1 1 1 1 1 1 1 1 最大值是255 加法运算5 + 4=9,转成二进制进行运算 1 0 1 +1 0 0 1 0 0 1 其他进制转换 八进制可以看作是三个二进制位代表一位

C# 二进制 十进制 十六进制 之间的转换

int a = 10; Console.WriteLine(a.ToString("X")); //10进制转16进制 Console.WriteLine(Convert.ToString(a, 16)); //10进制转16进制 Console.WriteLine(Convert.ToString(a, 2)); //10进制转2进制 string b = "1010"; Console.WriteLine(Convert.ToInt32(b, 2)); //2进

[C/C++]_[输出内存数据的二进制和十六进制的字符串表示]

场景: 1. 在读取文件或内存时,有时候需要输出那段内存的十六或二进制表示进行分析. 2. 标准的printf没有显示二进制的,而%x显示有最大上限,就是8字节,超过8字节就不行了. test_binary_hex.cpp #include <stdlib.h> #include <string.h> #include <stdio.h> #include <assert.h> #include <stdint.h> #include <i

二进制 八进制 十进制 十六进制之间的转换

一. 十进制与二进制之间的转换 (1)十进制转换为二进制,分为整数部分和小数部分 ① 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数.下面举例: 例:将十进制的168转换为二进制 得出结果 将十进制的168转换为二进制,(10101000)2 分析:第一步:将168除以2,商84,余数为0.  第二步:将商84除以2,商42余数为0. 

二进制,八进制,十进制,十六进制!!!!

一直以为进制转换离我很远,不会碰到这个问题,就算碰到了,百度一下就能解决,所以一直没关注过这个问题.直到有一天,碰到了一个进制转换问题,却不可以用百度...FUCK. 所以总结一下,二进制,八进制,十进制,十六进制如下: * 二进制全是0.1 * 八进制以0开头表示,0-7 * 十进制不能以0开头表示,0-9 * 十六进制以0x开头表示,0-9,A-F java中进制转换: A.十进制转换其他 十进制转成二进制  Integer.toBinaryString(int i) 十进制转成八进制  I

二进制 八进制 十进制 十六进制

一. 十进制与二进制之间的转换 (1) 十进制转换为二进制,分为整数部分和小数部分 ① 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数.下面举例: 例:将十进制的168转换为二进制 得出结果 将十进制的168转换为二进制,(10101000)2 分析:第一步,将168除以2,商84,余数为0. 第二步,将商84除以2,商42余数为0. 

C++分别以十进制和十六进制输出一个指针的地址

输出一个地址,cout默认以十六进制输出,可以用long(p)以十进制的方式输出.

(转 枫伶忆)二进制 八进制 十进制 十六进制之间转换

什么是二进制? 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现.当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的.计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0. 信息的存储单位 位(Bit) :度量数据的最小单位 字节(Byte):最常用的基本单位,一个字节有8位 b7  b6 b5 b4 b3 b2 b1

C语言中以十六进制输出字符型变量会出现&#39;ffffff&quot;的问题

最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: C代码   char buf[10] = {0}; buf[0] = 0xbf; printf("%2x\n\n\n", buf[0]);            /*在终端将会显示成:ffffffbf*/ buf[1] = 0x7f; printf("%2x\n\n\n", bu