質問: お世話になります。 rubyやphpにあるpack / unpack関数について質問です。 * pack関数はテキスト文字をバイナリ文字に変換する関数、という認識で合ってますでしょうか。 (「バイナリ文字列にパックする」という説明をよく見かけたのですが、パック=変換?) ※ちなみに「バイナリ文字」は「コンピュータが理解できる、テキストデータ以外のデータ」くらいの理解しかありません。。 * 例えばrubyで下記のコードを実行した結果、下記の通りになったのですが変換後の値("\x01"や"\a")はどこから出てきたのでしょうか。ASCIIコードではないですよね。。 また下記の[82, 117, 98, 121]をpackすると"Ruby"という文字になりますが、この[82, 117, 98, 121]は何の数字なのでしょうか。 ``` [1] pry(main)> [1].pack('C*') => "\x01" [2] pry(main)> [7].pack('C*') => "\a" [3] pry(main)> [82, 117, 98, 121].pack('C*') => "Ruby" ``` * unpackは「バイナリ(と文字列)を数値に変換する関数」という認識ですが、なんの数値に変換されるのでしょうか。 ``` "a".unpack("C*") => [97] # この 97 は何? ``` * そもそもの前提知識が足りないために理解できないのですが、どういったキーワードで知識を仕入れたらよいでしょうか。 例)「文字コード」「バイナリとは」など。。 画像ファイルやExcelファイルなどテキストエディタで開けないようなファイルも、 コンピュータ上ではバイナリ形式(2進数)で表されるため、 プログラム上でそういったバイナリファイルを扱う際にpackを使うのかなー、といった程度の理解だったのですが、 前提知識がないため、いくら調べても分かりませんでした。。 できるだけ砕いて説明頂けると、または知識の仕入れ先を教えて頂けるとありがたいです。 よろしくお願いいたします。
回答: > > 例えばrubyで下記のコードを実行した結果、下記の通りになったのですが変換後の値("\x01"や"\a")はどこから出てきたのでしょうか。ASCIIコードではないですよね。 > > > いえ、ASCIIコードです。1や7をバイト列に変換して、さらにそれを文字として解釈したのが`\x01`なり`\a`(`\x07`と同じ)です。 > > プログラム上でそういったバイナリファイルを扱う際にpackを使うのかなー、といった程度の理解だったのですが、 > > 前提知識がないため、いくら調べても分かりませんでした。 > > > `pack`や`unpack`を使う場面は、「バイナリで記録されたファイルを扱う」とか、「ネットワーク上を流れるバイナリデータを変換する」とか、通常はそのような前提があります。Rubyの世界だけで見ている場合は、なかなか使う機会はないと思いますし、ほぼお世話にはならないです。