[ruby-list:46146] 文字変換

View: New views
16 Messages — Rating Filter:   Alert me  

[ruby-list:46146] 文字変換

by 前川 映一 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


前川です。

小波さんのアドバイスを受け、どうにか、変換処理を
つくりましたが、どうしても、forループを使ってしまいます。

どなたか、each文にするスマートなコーディングに
手直しして、いただけませんか。
よろしくお願いします。

コーディングは、以下です。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
data1 = '91448a43835683588365838047' #船海システムG 26バイト
data2 = '54455354' #TEST 8バイト

mojiretu = ""   #文字列のバッファ
pointData = 0   #文字列のポインタ
baseData = ""   #"a2" のバッファ


for pointData in 0..data1.length/2 do #2バイトずつに分割するための"a2"を設
定する
  baseData = baseData + "a2"
end
strparts = data1.unpack(baseData)  #文字列を2バイトずつに分割する。

puts strparts #デバッグライト

for pointData in 0..data1.length/2 do
  mojiretu = mojiretu + strparts[pointData].hex.chr  #2バイトデータ→文字列
に変換
end
puts mojiretu #デバッグライト 変換結果(船海システムG)が、表示される



[ruby-list:46147] Re: 文字変換

by Hidetoshi NAGAI :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

永井@知能.九工大です.

From: eiichi_maekawa@...
Subject: [ruby-list:46146] 文字変換
Date: Fri, 3 Jul 2009 16:08:40 +0900
Message-ID: <OF5F527F54.FF76E71A-ON492575E8.00265FA8-492575E8.00273D60@...>
> 小波さんのアドバイスを受け、どうにか、変換処理を
> つくりましたが、どうしても、forループを使ってしまいます。
>
> どなたか、each文にするスマートなコーディングに
> 手直しして、いただけませんか。

やろうとしていることをそのままに直すなら,例えば
---------------------------------------------------------------
def convert(str)
  str.unpack('a2'*(str.length/2)).map{|c| c.hex.chr}.join('')
end

data1 = '91448a43835683588365838047' #船海システムG 26バイト
puts convert(data1)
---------------------------------------------------------------
とか?
--
永井 秀利  (nagai@...)
九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門


[ruby-list:46148] Re: 文字変換

by 前川 映一 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

前川です。

永井さん ありがとうございました。
私では、とても、実現できないコーディングです。
地道に、努力していきます。

Hidetoshi NAGAI <nagai@...> wrote on 2009/07/03 16:41:35:

> 永井@知能.九工大です.

> From: eiichi_maekawa@...
> Subject: [ruby-list:46146] 文字変換
> Date: Fri, 3 Jul 2009 16:08:40 +0900
> Message-ID: <OF5F527F54.FF76E71A-ON492575E8.00265FA8-492575E8.
> 00273D60@...>
> > 小波さんのアドバイスを受け、どうにか、変換処理を
> > つくりましたが、どうしても、forループを使ってしまいます。
> >
> > どなたか、each文にするスマートなコーディングに
> > 手直しして、いただけませんか。

> やろうとしていることをそのままに直すなら,例えば
> ---------------------------------------------------------------
> def convert(str)
> str.unpack('a2'*(str.length/2)).map{|c| c.hex.chr}.join('')
> end

> data1 = '91448a43835683588365838047' #船海システムG 26バイト
> puts convert(data1)
> ---------------------------------------------------------------
> とか?
> --
> 永井 秀利  (nagai@...)
> 九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門



[ruby-list:46149] Re: 文字変換

by Hidetoshi NAGAI :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

永井@知能.九工大です.

From: eiichi_maekawa@...
Subject: [ruby-list:46148] Re: 文字変換
Date: Fri, 3 Jul 2009 17:03:42 +0900
Message-ID: <OF5C46AA17.AE4F2D1D-ON492575E8.002BFD1E-492575E8.002C46AC@...>
> 永井さん ありがとうございました。

ついでにですが,こんなのでいいのかもしれません.
----------------------------------------------------------------------
def convert(str)
  str.gsub(/../){|c| c.hex.chr}
end
----------------------------------------------------------------------
--
永井 秀利  (nagai@...)
九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門


[ruby-list:46150] Re: 文字変換

by 前川 映一 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


前川です。

ありがとうございました。
とても、とても、思いつきません。
努力するしかないですね。

Hidetoshi NAGAI <nagai@...> wrote on 2009/07/03 17:14:16:

> 永井@知能.九工大です.

> From: eiichi_maekawa@...
> Subject: [ruby-list:46148] Re: 文字変換
> Date: Fri, 3 Jul 2009 17:03:42 +0900
> Message-ID: <OF5C46AA17.AE4F2D1D-ON492575E8.002BFD1E-492575E8.
> 002C46AC@...>
> > 永井さん ありがとうございました。

> ついでにですが,こんなのでいいのかもしれません.
> ----------------------------------------------------------------------
> def convert(str)
> str.gsub(/../){|c| c.hex.chr}
> end
> ----------------------------------------------------------------------
> --
> 永井 秀利  (nagai@...)
> 九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門



[ruby-list:46151] 文字から16進への変換方法について

by 前川 映一 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


前川です。

文字から、16進への変換方法がわかりません。

変換したいのは、
SJISを想定し、
船 → 0x91,0x44 に変換したいのです。

よろしくお願いします。



[ruby-list:46152] Re: 文字から16進への変換方法について

by rubikitch :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

From: eiichi_maekawa@...
Subject: [ruby-list:46151] 文字から16進への変換方法について
Date: Fri, 3 Jul 2009 18:06:41 +0900

るびきちです。

> 文字から、16進への変換方法がわかりません。
>
> 変換したいのは、
> SJISを想定し、
> 船 → 0x91,0x44 に変換したいのです。

Ruby 1.8、Ruby 1.9共通。

# -*- coding: cp932 -*-
"船".each_byte do |byte|
  "%#x" % byte  # => "0x91", "0x44"
end

String#each_byteでそれぞれのバイトでループします。
そして、byte(整数)を String#% を使って書式文字列 %#x で 0x〜 に変換します。

--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/
Twit: http://twitter.com/rubikitch/



[ruby-list:46168] Re: 文字から16進への変換方法について

by 前川 映一 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

前川です。

るびきちさんの助言で、なんとか、変換処理作りましたが、
もう少し、Rubyらしいコーディングにしたいのですが、
どなたか、ご教示願います。
よろしくお願いします。

るびきちさんの助言=======

> # -*- coding: cp932 -*-
> "船".each_byte do |byte|
> "%#x" % byte  # => "0x91", "0x44"
> end

> String#each_byteでそれぞれのバイトでループします。
> そして、byte(整数)を String#% を使って書式文字列 %#x で 0x〜 に変換しま
す。
=====================

下名が作成したプログラム(SJIS)−−−−−−−−−−−

data1 = '船海システムG' # 26バイトの '91448a43835683588365838047'に変換する
data2 = 'TEST' # 8バイトの '54455354'に変換する
data3 ='船'

def textToHexConversion(data)
  textHex=''
  byteConversionData = ['a','b','c','d','e','f']

  data.each_byte do |byte|
    "%#x" % byte
    textHex = textHex + (byte/16).to_s
    byte2 = byte % 16
    if (byte2 > 9)  #10以上は、aからfに置き換える
      textHex = textHex + byteConversionData[byte2-10]
    else
      textHex =textHex+byte2.to_s
    end
  end
  return textHex
end

puts textToHexConversion(data1) # data1の変換
puts textToHexConversion(data2) # data2の変換
puts textToHexConversion(data3) # data3の変換

−−−−−−−−−−−−−−−−−−−



[ruby-list:46169] Re: 文字から16進への変換方法について

by NARUSE, Yui-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

成瀬です。

eiichi_maekawa@... wrote:
> るびきちさんの助言で、なんとか、変換処理作りましたが、
> もう少し、Rubyらしいコーディングにしたいのですが、
> どなたか、ご教示願います。
> よろしくお願いします。

>     textHex = textHex + (byte/16).to_s
String#to_sのマニュアルを読み返してみましょう。
to_sは引数を取るのです。

>     "%#x" % byte
のあたりに考慮の跡は見えますが、sprintfのマニュアルも見直して見るとよいかと。
こちらの方法の方が%02xがあるからより楽でしょう。

最もRubyらしい……というかPerlらしい方法は、

 '船海システムG'.unpack('H*')[0]

でしょうね。

--
NARUSE, Yui  <naruse@...>


[ruby-list:46170] Re: 文字から16進への変換方法について

by Hidetoshi NAGAI :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

永井@知能.九工大です.

From: eiichi_maekawa@...
Subject: [ruby-list:46168] Re: 文字から16進への変換方法について
Date: Mon, 6 Jul 2009 18:30:35 +0900
Message-ID: <OF667B9E0F.0DE8AB87-ON492575EB.00333E0F-492575EB.00343BE4@...>
> るびきちさんの助言で、なんとか、変換処理作りましたが、
> もう少し、Rubyらしいコーディングにしたいのですが、
> どなたか、ご教示願います。

せっかく教えていただいた "%#x" の # の意味くらいは
自分で調べた方がいいとは思いますが...

str = '船海システムG' であるとするとき,
block を与えない each_byte が Enumerable::Enumerator オブジェクトを
返すようになったバージョンの Ruby であれば,
--------------------------------------------------------------------
 str.each_byte.map{|x| '%x' % x}.join('')
--------------------------------------------------------------------
なんてのでもいいでしょうね.

block を与えないと each_byte がエラーになるようなバージョンの Ruby なら,
--------------------------------------------------------------------
  (s = ''; str.each_byte{|x| s << '%x' % x}; s)
--------------------------------------------------------------------
とかでしょうか.
--
永井 秀利  (nagai@...)
九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門


[ruby-list:46171] Re: 文字から16進への変換方法について

by Hidetoshi NAGAI :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

永井@知能.九工大です.

From: Hidetoshi NAGAI <nagai@...>
Subject: [ruby-list:46170] Re: 文字から16進への変換方法について
Date: Mon, 6 Jul 2009 19:28:30 +0900
Message-ID: <20090706.192828.41652309.nagai@...>
> --------------------------------------------------------------------
>  str.each_byte.map{|x| '%x' % x}.join('')
> --------------------------------------------------------------------

これでは 16 進 1 桁になる場合にまずかったですね.(^_^;
成瀬さんからのメールにも述べられている通り,
'%x' ではなく '%02x' でないとダメでした.
ごめんなさい.
--
永井 秀利  (nagai@...)
九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門



[ruby-list:46174] Re: 文字から16進への変換方法について

by 前川 映一 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

成瀬さん、ありがとうございました。
マニュアルも見たりはしているのですが、まだまだ、見方が
足りないようです。
perlらしい記述、参考にさせていただきます。

"NARUSE, Yui" <naruse@...> wrote on 2009/07/06 19:27:18:

> 成瀬です。

> eiichi_maekawa@... wrote:
> > るびきちさんの助言で、なんとか、変換処理作りましたが、
> > もう少し、Rubyらしいコーディングにしたいのですが、
> > どなたか、ご教示願います。
> > よろしくお願いします。

> >     textHex = textHex + (byte/16).to_s
> String#to_sのマニュアルを読み返してみましょう。
> to_sは引数を取るのです。

> >     "%#x" % byte
> のあたりに考慮の跡は見えますが、sprintfのマニュアルも見直して見るとよいか
と。
> こちらの方法の方が%02xがあるからより楽でしょう。

> 最もRubyらしい……というかPerlらしい方法は、

> '船海システムG'.unpack('H*')[0]

> でしょうね。

> --
> NARUSE, Yui  <naruse@...>



[ruby-list:46175] Re: 文字から16進への変換方法について

by 前川 映一 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

永井さん

ありがとうございます。
先のご指摘も、ありがとうございました。
まだまだ、はじめたばかりですので、マニュアルも、ほとんど見ていませんでし
た。
なるべく、調べるようにしたいと思います。

Hidetoshi NAGAI <nagai@...> wrote on 2009/07/06 19:32:26:

> 永井@知能.九工大です.

> From: Hidetoshi NAGAI <nagai@...>
> Subject: [ruby-list:46170] Re: 文字から16進への変換方法について
> Date: Mon, 6 Jul 2009 19:28:30 +0900
> Message-ID: <20090706.192828.41652309.nagai@...>
> > --------------------------------------------------------------------
> >  str.each_byte.map{|x| '%x' % x}.join('')
> > --------------------------------------------------------------------

> これでは 16 進 1 桁になる場合にまずかったですね.(^_^;
> 成瀬さんからのメールにも述べられている通り,
> '%x' ではなく '%02x' でないとダメでした.
> ごめんなさい.
> --
> 永井 秀利  (nagai@...)
> 九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門



[ruby-list:46176] メソッドの扱いについて

by 前川 映一 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

前川です。

文字変換関連、どうにか、メソッドを作りこみましたが、
作ったメソッドを、外部参照で、使用できるようにしたいのですが。

クラスにした場合、

class MyConversion
  def initialize(data)
   @data = data
  end

  def textToHex
    @data.unpack('H*')[0] #成瀬さん ありがとうございました。
  end

  def hexToText
    @data.gsub(/../){|c| c.hex.chr} #永井さん ありがとうございました。
  end
end

呼ぶ側は、

result = MyConversion.new('船')
result1 = result.textToHex

あるいは、

result1 = MyConversion.new('船').textToHex

ですが、メソッドとして、外部参照するような
使い方(メソッドの延長??) MyConversion.textToHex(データ) に
は、できないでしょうか。
たとえば、

convFunc = MyConversion.new #MyConversion を使用するための定義(実態の作成)
result = convFunc.textToHex('船')    または、'船'.convFunc.textToHex
result1 = convFunc.textToHex('長崎')         '長崎'.convFunc.textToHex

というような具合に。

また、参照する側は、'require パス/ファイル名' で、ファイル内のメソッドを
参照することになると思いますが・・

ご教示、よろしくお願いします。





[ruby-list:46179] Re: メソッドの扱いについて

by rubikitch :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

From: eiichi_maekawa@...
Subject: [ruby-list:46176] メソッドの扱いについて
Date: Tue, 7 Jul 2009 13:37:01 +0900

るびきちです。

> 前川です。
>
> 文字変換関連、どうにか、メソッドを作りこみましたが、
> 作ったメソッドを、外部参照で、使用できるようにしたいのですが。
>
> クラスにした場合、
>
> class MyConversion
>   def initialize(data)
>    @data = data
>   end
>
>   def textToHex
>     @data.unpack('H*')[0] #成瀬さん ありがとうございました。
>   end
>
>   def hexToText
>     @data.gsub(/../){|c| c.hex.chr} #永井さん ありがとうございました。
>   end
> end
>
> 呼ぶ側は、
>
> result = MyConversion.new('船')
> result1 = result.textToHex
>
> あるいは、
>
> result1 = MyConversion.new('船').textToHex
>
> ですが、メソッドとして、外部参照するような
> 使い方(メソッドの延長??) MyConversion.textToHex(データ) に
> は、できないでしょうか。
> たとえば、
>
> convFunc = MyConversion.new #MyConversion を使用するための定義(実態の作成)
> result = convFunc.textToHex('船')    または、'船'.convFunc.textToHex
> result1 = convFunc.textToHex('長崎')         '長崎'.convFunc.textToHex
>
> というような具合に。

できますよ。

# メソッド名は単語を_で区切るのがRubyのやり方です。

# -*- coding: euc-jp -*-
class MyConversion
  def text_to_hex(data)
    data.unpack('H*')[0]
  end

  def hex_to_text(data)
    data.gsub(/../){|c| c.hex.chr}
  end
end
MyConversion.new.text_to_hex('船') # => "c1a5"

# クラスメソッドを定義するのはこうする
class MyConversion
  def self.text_to_hex(data)
    data.unpack('H*')[0]
  end

  def self.hex_to_text(data)
    data.gsub(/../){|c| c.hex.chr}
  end
end
MyConversion.text_to_hex('船') # => "c1a5"

--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/
Twit: http://twitter.com/rubikitch/
『Ruby逆引きハンドブック』 http://d.hatena.ne.jp/rubikitch/20090525/rubybook


[ruby-list:46182] Re: メソッドの扱いについて・ruby-list:46179

by 前川 映一 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

るびきちさん、ありがとうございました。


rubikitch@... wrote on 2009/07/07 21:31:01:

> From: eiichi_maekawa@...
> Subject: [ruby-list:46176] メソッドの扱いについて
> Date: Tue, 7 Jul 2009 13:37:01 +0900

> るびきちです。

> > 前川です。
> >
> > 文字変換関連、どうにか、メソッドを作りこみましたが、
> > 作ったメソッドを、外部参照で、使用できるようにしたいのですが。
> >
> > クラスにした場合、
> >
> > class MyConversion
> >   def initialize(data)
> >    @data = data
> >   end
> >
> >   def textToHex
> >     @data.unpack('H*')[0] #成瀬さん ありがとうございました。
> >   end
> >
> >   def hexToText
> >     @data.gsub(/../){|c| c.hex.chr} #永井さん ありがとうございました。
> >   end
> > end
> >
> > 呼ぶ側は、
> >
> > result = MyConversion.new('船')
> > result1 = result.textToHex
> >
> > あるいは、
> >
> > result1 = MyConversion.new('船').textToHex
> >
> > ですが、メソッドとして、外部参照するような
> > 使い方(メソッドの延長??) MyConversion.textToHex(データ) に
> > は、できないでしょうか。
> > たとえば、
> >
> > convFunc = MyConversion.new #MyConversion を使用するための定義(実態の
作成)
> > result = convFunc.textToHex('船')    または、'船'.convFunc.textToHex
> > result1 = convFunc.textToHex('長崎')         '長崎'.convFunc.textToHex
> >
> > というような具合に。

> できますよ。

> # メソッド名は単語を_で区切るのがRubyのやり方です。

> # -*- coding: euc-jp -*-
> class MyConversion
> def text_to_hex(data)
> data.unpack('H*')[0]
> end

> def hex_to_text(data)
> data.gsub(/../){|c| c.hex.chr}
> end
> end
> MyConversion.new.text_to_hex('船') # => "c1a5"

> # クラスメソッドを定義するのはこうする
> class MyConversion
> def self.text_to_hex(data)
> data.unpack('H*')[0]
> end

> def self.hex_to_text(data)
> data.gsub(/../){|c| c.hex.chr}
> end
> end
> MyConversion.text_to_hex('船') # => "c1a5"

> --
> rubikitch
> Blog: http://d.hatena.ne.jp/rubikitch/
> Site: http://www.rubyist.net/~rubikitch/
> Twit: http://twitter.com/rubikitch/
> 『Ruby逆引きハンドブック』
http://d.hatena.ne.jp/rubikitch/20090525/rubybook