質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

680閲覧

rubyのbinary stringの形がよく分かりません

nanashisan774s

総合スコア2

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2021/10/01 06:21

編集2021/10/01 06:45

rubyのSecureRandom.random_bytesの説明を見ていたのですが、以下の内容が分かりませんでした。

SecureRandom.random_bytes generates a random binary string.

The argument n specifies the length of the result string.
If n is not specified or is nil, 16 is assumed. It may be larger in future.
The result may contain any byte: “\x00” - “\xff”.
p SecureRandom.random_bytes #=> "\xD8\xE0\xF4\r\xB2\xFC*WM\xFF\x83\x18\xF45\xB6"
p SecureRandom.random_bytes #=> "m\xDC\xFC/\a\x00Uf\xB2\xB2P\xBD\xFF6S\x97"

太字部分を見ると、1バイトの並びが続く文字列が出力されるようにも見えたのですが、
実際の結果は純粋な\x00の並びではなく、ところどころ文字が挟まっているように見えます。
"バイナリデータだから文字列にすると変な形になる"とすると、太字の説明はなにを表しているのでしょうか。

合わせて、別の質問もさせてください。
random_bytesについて、web上のリファレンスを見ると出力結果が異なっていました。
https://docs.ruby-lang.org/ja/latest/class/SecureRandom.html

random binary string.

require 'securerandom'
p SecureRandom.random_bytes(10) #=> "\016\t{\370g\310pbr\301"
p SecureRandom.random_bytes(10) #=> "\323U\030TO\234\357\020\a\337"

こちらは8進数の並びが微妙に続いているように見えますが、自分のirb上では以下のように出力形式が16進数の並びっぽくなります。
この出力形式の違いはどこから来るのでしょうか。

Ruby version: 3.0.2

irb(main):001:0> require 'securerandom'

=> true
irb(main):002:0> p SecureRandom.random_bytes(10)
"\xF8\x8A\x1AG:\x1C\x15\x12\x03("
=> "\xF8\x8A\x1AG:\x1C\x15\x12\x03("
irb(main):003:0> p SecureRandom.random_bytes(10)
"\x9D\x80\xBE\x97\xF2f9g\xFC\xDF"
=> "\x9D\x80\xBE\x97\xF2f9g\xFC\xDF"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/10/01 06:23

> 自分のirb上ではこのような出力にはなりません。 どういう出力になるんでしょう。それを提示しよう
nanashisan774s

2021/10/01 06:45

失礼しました。出力結果を追記しました。
guest

回答2

0

ascii文字としてコントロールコードでないものはそのまま
コントロールコードのものは10進、8進,16進で表示されるだけってこと

投稿2021/10/01 06:52

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanashisan774s

2021/10/01 07:18

出力結果がASCII文字列であることも分かっていませんでした。 ご回答いただきありがとうございます。
guest

0

ベストアンサー

"バイナリデータだから文字列にすると変な形になる"とすると、太字の説明はなにを表しているのでしょうか。

「バイナリデータだから文字列にすると(必ず)変な形になる」という仮定が誤っています。0x00~0xffの間には、ASCIIとして有効な文字も入っていて、それをpで表示すればエンコードされずASCII文字として表示されます。

投稿2021/10/01 06:49

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/10/01 06:50

> この出力形式の違いはどこから来るのでしょうか。 気にする必要そのものがありません。pはあくまでデバッグ時に確認する目的で使うものであり、表示が8進法であろうが16進法であろうが、得られるデータには何ら違いはありません。
nanashisan774s

2021/10/01 07:17

なるほど!! irb(main):009:0> "\x72" => "r" irb(main):010:0> "\x5c" => "\" 確かに一つずつ見ると変換した形で出力されていました。 そもそも、出力結果がASCII文字列であることも分かっていませんでした。 ご回答いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問