2011-07-26 3 views
19

好奇心の高まりから、バイナリコードがどのようにして文字に変換されるのですか?バイナリを自動的に単語に変換するサイトがあることを知っていますが、バイナリコードが文字に変換される前に特定の中間ステップを理解したいと思います。バイナリコードはどのくらい正確に文字に変換されますか?

+0

バイナリコードとはどういう意味ですか? ASCIIコードから対応する文字までを意味しますか? – Giorgio

答えて

17

"バイナリコード"とは単純な古いデータ(ビットシーケンスまたはバイトシーケンス)を意味し、 "文字"は文字を意味すると仮定すると、答えは2段階になります。しかし、まず、いくつかの背景。

  • 文字は、「LATIN CAPITAL LETTER A」や「GREEK SMALL LETTER PI」や「BLACK CHESS KNIGHT」などの名前付きシンボルに過ぎません。文字(抽象記号)をグリフ(文字の絵)と混同しないでください。
  • 文字セットは、特定の文字セットで、それぞれがコードポイントと呼ばれる特別な番号に関連付けられています。 Unicode文字セットのコードポイントのマッピングを確認するには、http://www.unicode.org/Public/UNIDATA/UnicodeData.txtを参照してください。 、ラテン-1、UTF-8のようなもの、

    1. データ、それがテキストであれば、文字エンコーディングで何とか添付しなければならない。今ここに

オーケーは、2つのステップですUS-ASCIIなどがあります。各文字エンコーディングスキームは、バイトシーケンスがどのようにコードポイントとして解釈されるか(逆にコードポイントがバイトシーケンスとしてエンコードされる方法)を詳細に指定します。

  • バイトシーケンスがコードポイントとして解釈されると、各文字に特定のコードポイントがあるため、文字があります。

  • カップルノート:いくつかのエンコーディングで

    • あなたは文字のデコードエラーを持つことができるので、特定のバイト列は、まったくコードポイントに対応しています。
    • 一部の文字セットでは、使用されていないコードポイントがあります。つまり、まったく文字に対応しません。

    つまり、すべてのバイトシーケンスがテキストとして何かを意味するわけではありません。

    +0

    非常に啓発の応答。重要な知識が含まれており、これをうまく使います。ありがとうございます。 –

    7

    たとえば、011001100110111101101111fooの変換を意味しますか?バイナリストリームを別々のバイト(011001100110111101101111)に分割し、指定された番号に対応するASCII文字をルックアップするだけです。例えば、01100110は小数で102とコード102とのASCII文字はfある:

    $ perl -E 'say 0b01100110' 
    102 
    $ perl -E 'say chr(102)' 
    f 
    

    See what the chr function does。)このアルゴリズムを一般化し、キャラクタ当たりのビットと異なる符号化、ポイントが残っの異なる数を有することができ同じ。

    0

    010010001001001を2ビットの8文字に分割してください(01001000、01001001)。そして、最初の8が、彼らはそれが資本だかない場合には、^ 1 2(2、2^2 2 ^の権限をやって右から左に行く決める最初の3を無視する権限

    01001000. 01001001.

    を発行3 2^4 2^5)。それで、すべての文字を1つだけ追加して、それを8にして、アルファベットの8文字がhなので、最初のビットが文字h、もう1ビットでそれを試してください

    16

    ここでは、 2進数をASCII文字に変換することができます。

    1 - 4桁の2進数を1桁の16進数に変換します。 - 代わりの各桁

    0001 = 1 
    0010 = 2 
    0011 = 3 
    0100 = 4 
    0101 = 5 
    0110 = 6 
    0111 = 7 
    1000 = 8 
    
    1001 = 9 
    1010 = a (the hex number a, not the letter a) 
    1011 = b 
    1100 = c 
    1101 = d 
    1110 = e 
    1111 = f 
    

    (16進数Fを介している小数15を介して10進数、または「ベース16」が何番号:ここ

    ヘキサ変換チャートをバイナリです10進数のように10個の異なる数字[0 - 9]を表すことができる、すなわち "基数10"の場合は、代わりに16桁の異なる数字[0 - f]を表すことができます)。

    チャートバイナリ数字の任意の文字列を16進数の文字列に変換するのは簡単です。例えば

    01000100 = 0100 0100 = 44 hex 
    1010001001110011 = 1010 0010 0111 0011 = a273 hex 
    

    右、十分に簡単?任意の長さの2進数を16進数に変換するのは簡単なことです。

    (これは16進数が16で2進数が2のため16が2の4乗であるため動作しますので、4桁の2進数字が1桁の16進数になります。 2、バイナリを10進数にほぼ簡単に変換することはできません)。

    2 - 16進数の文字列をペアに分割します。

    数値をASCIIに変換する場合、2桁の16進数はすべて1文字です。そのため、16進文字列を2桁のセットに分割します。

    あなたはこのような6対に7340298b392このような進数を分割します:

    7340298b392 = 07 34 02 98 b3 92 
    

    (私は奇数桁の16進数を持っていたことから、私は0を先頭に追加注意してください。)

    ています6桁の16進数なので、6文字になります。 (私はすぐに分かりますが、98、b3、92は文字ではありません。理由は分かります)

    3 - 各16進数の数字を10進数に変換します。

    左桁の10進数に16を掛け、2を足してこれを行います。

    たとえば、b3 hex = 11 * 16 + 3、これは110 + 66 + 3で、179. (b hexは10進数の11です。)

    4 - 10進数をASCII文字に変換します。

    ここで、10進数のASCII文字を取得するには、ASCIIで65が大文字の「A」であり、97が小文字の「a」であることに留意してください。

    どのような手紙は68ですか?

    68大文字のアルファベットの4番目の文字ですが、そうですか?
    65 = A、66 = B、67 = C、68 = D

    したがって、68は「D」である。

    数値が97より小さい場合は小数点以下を、大文字の場合は64を引いて、小数点以下の場合は小文字の場合は96を引いて、これはその集合に関連付けられたアルファベットの文字の数です2桁の16進数です。あなたは簡単進演算の少しを恐れていないなら


    あるいは、あなたは、ステップ3をスキップすることができ、そしてちょうど例えば、思い出しにより、ASCIIへの六角から直進し、その

    hex 41 = 'A' 
    hex 61 = 'a' 
    

    大文字の場合は40進数を、小文字の場合は60進数を減算し、アルファベットの英字を得るために左にあるものを10進数に変換します。

    01101100 = 6c, 6c - 60 = c = 12 decimal = 'l' 
    01010010 = 52, 52 - 40 = 12 hex = 18 decimal = 'R' 
    

    例えば

    (これを実行すると、それは「M」(または「M」)は、アルファベットの13文字であることを覚えておくと便利です。あなたがカウントアップまたはダウン13からにすることができますので。どちらかの端に比べて真ん中に近いの手紙を見つける。)

    私はかつてシャツにこれを見て、私の頭の中でそれを読むことができました:

    01000100 
    01000001 
    01000100 
    

    私はこのようにそれをやった:

    01000100 = 0100 0100 = 44 hex, - 40 hex = ucase letter 4 = D 
    01000001 = 0100 0001 = 41 hex, - 40 hex = ucase letter 1 = A 
    01000100 = 0100 0100 = 44 hex, - 40 hex = ucase letter 4 = D 
    

    シャツには、妊娠中の女性が購入していたので、ちょっと涼しいと思った「DAD」と書かれていました。彼女の夫は私のようなオタクでなければなりません。


    92、b3、および98が手紙ではないことを私が直ちに知ったことはありますか?

    小文字の 'z'のASCIIコードは96 + 26 = 122であるため、16進数は7aです。 7aは文字の最大16進数です。 7a以上のものは手紙ではありません。


    これは、人間として行う方法です。

    コンピュータプログラムはどのように機能しますか?

    8進数の各セットについて、数値に変換し、ASCIIテーブルで参照してください。

    (これはかなり明白で簡単な方法です。典型的なプログラマーは、おそらく数十分の一の間に10または15の方法を考えることができます。詳細はコンピュータ言語環境に依存します。)

    +0

    私は16進数字なしで読むのがより簡単であることを知っています、別名 '01000100'を' 2^6 + 2^2' = 68と直接見てください。 – Blauhirn

    +0

    興味深い。見てみましょう、私は右端の数字は2^0だから、2^6は右端から7桁目です。 2^6は.. 2,4,8,16,32,64 ..そして2^2は2 * 2で4なので、それは68になります。アスキーコードは8ビット幅なので、私は10進数が4ビットであることが分かっている場合よりも01011010のようなものは長くかかるかもしれませんが、2から7ビットの累乗(01111010が最大の文字です)を知っていれば、その方法は十分に実用的かもしれません。 0101 = 5,1010 = A、したがって5A。文字に変換する:0x5A - 0x40(キャップ​​文字)= 0x1A = 16 + 10 = 26(キャップ​​文字で)= 'Z'。 – Shavais

    +0

    本当に小数点以下を扱う方が良いのであれば、実際には小数点を4ビットまで知ることができ、8ビットごとに左のセットに16を掛けて2番目のセットを追加することができます。したがって、0101:1010 = 5:10 = 5 * 16 + 10 = 50 + 30 + 10 = 90。64が大文字を引く10進数であることを知っていれば、26( 'Z')になります。 – Shavais

    関連する問題