byte 16進2進理解

5378 ワード

16進数
以下の内容はブログを参照してください:0 x 16進数について
コンセプト
0 xから始まるデータは16進数を表し、コンピュータの各ビットの重みは16(10進数の重みは10)、すなわち(16進数)10=(10進数)1である.×16.備考:ここの0は数字0で、アルファベットOではありません!
なぜ16進法が必要なのか
プログラミングでは、私たちがよく使うのはやはり10進法です......結局C/C++は高級言語です.
例えば、int a=100、b=99;
しかし,コンピュータにおけるデータの表現は最終的にはバイナリ形式で存在するため,バイナリを用いることがあり,より直感的に問題を解決することができる.しかし、バイナリ数が長すぎます.例えばintタイプは4バイト,32ビットを占有する.例えば100,intタイプのバイナリ数で表すと:0000 0000 0000 0000 0000 0000 0110 0100
このような長い数に直面して考えたり操作したりして、誰も好きではありません.したがって,C,C++はコードに直接バイナリ数を書き込む方法を提供していない.16進数または8進数でこの問題を解決することができます.なぜなら、進数が大きいほど、数の表現長さが短くなるからです.しかし、なぜわざわざ16進数や8進数で、他の9進数や20進数ではないのでしょうか.2、8、16、それぞれ2の1次方、3次方、4次方です.これにより、3つの進数間で非常に直接的に互いに変換することができる.8進数または16進数はバイナリ数を短縮したが、バイナリ数の表現特徴を維持した.次の進数変換に関する授業では、この点を見つけることができます.
16進数を10進数に変換する
2進法で、2つのアラビア数字を使います:0、1;8進数、8つのアラビア数字:0、1、2、3、4、5、6、7;10進数、アラビア数字10個:0から9;
16進数、16アラビア数字で・・・など、アラブ人かインド人は、10数字しか発明していませんよね?16進法は16進1ですが、私たちは0~9という10の数字しかありません.だから、A、B、C、D、E、Fという6つのアルファベットでそれぞれ10、11、12、13、14、15を表しています.アルファベットは大文字と小文字を区別しません.16進数の0位の重みは16の0次、1位の重みは16の1次、2位の重みは16の2次…
したがって、N番目(Nは0から始まる)ビットにおいて、数X(Xが0以上、Xが15以下、すなわち、F)で表される大きさX*16のN乗である.
16進数2 AF 5があるとしたら、どのように10進数に換算しますか?縦計算:2 AF 5換算10進数:0位:5*16^0=5 1位:F*16^1=240 2位:A*16^2=2560 3位:2*16^3=8192
10997直接計算は:5*16^0+F*16^1+A*16^2+2*16^3=10997
16進数相互変換
特殊な書き方を使わないと、16進数も10進数と混ざります.任意の数:9876では、16進数または10進数とは見えません.C,C++は,16進数は0 xで始まることを規定している.例えば0 x 1は16進数を表す.1は10進数を表します.また、0 xff、0 xFF、0 X 102 Aなど.その中のxも大文字と小文字を区別しない.(注:0 xの0はアルファベットOではなく数字0です)
以下に、int a=0 x 100 Fの使用例を示します.int b = 0x70 + a; これで、すべての進数:10進数、8進数、16進数の表現を学びました.
C/C++では、10進数は正負の分があり、例えば12は正12を表し、-12は負12を表す.しかし、8進数と16進数は記号のない正の整数を表すためにしか使用できません.コードに-078、または-0 xF 2、C、C++と書いても負の数ではありません.
16進数相互変換
バイナリと16進数の相互変換が重要です.しかし、この2つの変換は計算する必要はありません.C、C++プログラマーは2進数を見ることができ、直接16進数に変換することができます.逆も同じです.私たちも同じように、この小節を勉強すれば、できます.
まず、バイナリ数:1111を見てみましょう.それはいくらですか.また、1*2^0+1*2^1+1*2^2+1*2^3=1*1+1*2+1*4+1*8=15と計算することもできます.
しかしながら、1111は4ビットであるため、各ビットの重み値を直接記憶し、8、4、2、1を高位から低位に記録しなければならない.すなわち,最上位の重み値は8であり,次いで4,2,1の順である.8421を覚えておいてください.いずれの4ビットのバイナリ数に対しても、対応する10進数値をすぐに算出することができます.
以下に、4ビットのバイナリ数xxxxのすべての可能な値をリストします.(中間省略部分)4ビットのみの2進数高速計算方法10進数16進数値1111=8+4+2+1=15->F 1110=8+4+2+0=14->E 1101=8+4+0+1=13->D 1100=8+4+0+0=12->C 1011=8+0+2+1=11->B 1010=8+0+2+0=10->A 1001=8+0+0+1=9->9…0001=0+0+0+0+1=1=1,000+0+1=1,0000 + 0 + 0 = 0 0
byte
自分の理解を話します.
JAvaではbyteが最小の基本データ型であり,8ビット,すなわち2の8次方のみである.符号なし整数範囲0~256を表す.符号付き整数範囲-127~128(十進法)を表す.その取値範囲の理解についてはjavaのbyteタイプについて詳しく説明する
よく使われるbyte[]配列は、各要素の範囲が-127~128であることがわかります.しかし、実は16進数で表すこともできます.上の16進法の説明から分かるように、16進法は符号のない整数しか表さない.その表現範囲は0〜256だ.16進数で表すと0 X 00~0 xFF(15*16+16)です.
だから、16進byte[]から10進byte[]に移るという操作があり、最初は理解していませんでした.byte[]の各要素を16進数-10進数に変換します.
20201202
以上の言い方は間違っていると感じて、いくつかの博文を見て、正しい理解は以下のようにすべきだと思います.
  • まずbyte配列の要素タイプがbyteタイプであり、String[]の各要素が文字列であり、int[]の各要素がint値であるようにします.したがって、16進byte[]回転10進byte[]は存在しません.
  • byteは何ですか
  • byte、すなわちバイトは、8ビットのバイナリからなる.Javaではbyteタイプのデータは8ビット符号付きのバイナリ数です.コンピュータがデータ伝送とデータ計量を行う最も基本的な単位であり、ファイルは5バイト大きいと言える.しかし、この書類は40桁大きいとは言えません.
  • バイト配列使用シーン
  • バイトはデータ転送の最小単位です.たとえば、プログラムはディスクからメモリに画像を読み込む画像を表示します.どんな形で読みますか.byte[]配列の形で読みます.例えば、ネットワークから画像をダウンロードすると、メモリもbyte[]配列で受信します.
  • バイト配列と16進数は、バイト配列と16進数の変換が、16進数文字列間のバイト配列の相互回転であることを明確にします.例えば、TCP伝送、MD 5暗号化などのシーンに適用される.16進数(Hex)は、ちょうど4つのバイナリ・ビットです.1バイト(byte)は8つのバイナリ・ビットです.したがって、1バイトは2つの16進数として表すことができます.16進数は、byte[]配列を16進数に変換する必要があるため、ネットワーク・オーバーヘッドを節約できます.たとえば、「1234 ab」「文字列は一般的に6つのbyteを占有しており、byte[6]を直接アップロードしてネットワークモジュールに渡して通信することができるが、16進数文字に変換すると0 x 12 0 x 34 0 xabとなり、3つのbyteしか必要としない.1バイトで2つの16進数
  • を表すことができる
    コンピュータでは、数はすべてバイナリコードで表され、16進数コードはバイナリコードの別の表現形式にすぎないため、同じ数を16進数で表すか、バイナリで表すか、コンピュータで同じ大きさの記憶空間を占有する.16進法を使うのは便利のためだけだ.転送100のような2進数を使用すると、intタイプの2進数で表されるのは、0000 0000 0000 0000 0000 0110 0100であるからである.だから私たちは転送時に16進数を使います.
    個人的には、異なる進数はデータの異なる表現にすぎないことを理解しています.byte[]は、コンピュータストレージの基本単位を表します.まるでbyte[]はバスケットで、チョコレートを保管するのに使われています.異なる進数は異なる振り方である.バスケットにどれだけチョコレートを入れるかは固定されています
    ネットワークデータの取得においてbyte[]のデータには、例えば7 B 5 Aというデータがあり、これが16進数の表現である.ネットワーク通信ではbyte[]のデータを16進数で表す必要があるからです.では、ネットワークでint値(各intは32ビット)を転送するには、4つのbyte(各byteは8ビット)が必要です.String文字列をネットワークに転送する場合は、まず文字列をbyte[]配列に変換する必要があります.このbyte[]配列の各要素は10進数で表されていることに注意してください.次のように16進数に置き換える必要があります.
    /**
    	 *        16  (  Unicode  )
    	 * 
    	 * @param str
    	 * @return
    	 */
    	public static String str2HexStr(String str) {
    		char[] chars = "0123456789ABCDEF".toCharArray();
    		StringBuilder sb = new StringBuilder("");
    		byte[] bs = str.getBytes();
    		int bit;
    		for (int i = 0; i < bs.length; i++) {
    			bit = (bs[i] & 0x0f0) >> 4;
    			sb.append(chars[bit]);
    			bit = bs[i] & 0x0f;
    			sb.append(chars[bit]);
    			// sb.append(' ');
    		}
    		return sb.toString().trim();
    	}
     
    	/**
    	 * 16           (  Unicode  )
    	 * 
    	 * @param hexStr
    	 * @return
    	 */
    	public static String hexStr2Str(String hexStr) {
    		String str = "0123456789ABCDEF";
    		char[] hexs = hexStr.toCharArray();
    		byte[] bytes = new byte[hexStr.length() / 2];
    		int n;
    		for (int i = 0; i < bytes.length; i++) {
    			n = str.indexOf(hexs[2 * i]) * 16;
    			n += str.indexOf(hexs[2 * i + 1]);
    			bytes[i] = (byte) (n & 0xff);
    		}
    		return new String(bytes);
    	}
    
    

    実験証明:
    1つの文字列を直接バイト配列に変換し、1つの文字列を16進数文字列に変換してバイト配列に変換します.バイト配列は同じです