bytes 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0a19bb2ea18c1602e43b0a6a7d9b07acc67111ed
4
- data.tar.gz: 133e19b5b91c09541ffdf4d9bb8cfe26d33ec521
2
+ SHA256:
3
+ metadata.gz: 5a8baa99382e45238e96527a5aab45a04daf4b73a2d4e1f64b3bf87530e14a7d
4
+ data.tar.gz: ec170b28a4efd3d7b0cdf45094831a68a86d60785f313668baa24cbf5a106085
5
5
  SHA512:
6
- metadata.gz: 5047b0bb6dab48dafb5466bf8026b1803c6f99250ead35e252d9f9319fbc536579983e3b90b6abb1c02526e37ac84c2d7209f694fb396053fc326a72e2900d6d
7
- data.tar.gz: 797925e673cb380aa1d0294af8a42ca89b27c303363c027dd5734a3a845d5133f57910d2446c6b8613553ac97b4467f6f7e20ef34012bb3d2c717086dcd46695
6
+ metadata.gz: 8f62ad42592bfd8e69fb9bf53526ba19e3568b7140f88bfa9bf524ee1ac8af3258dd2d156f6080d08e63ecbcb92cf0e8f531f56f4c3b32faad8477b7efdf8423
7
+ data.tar.gz: 728487df6ca9ad9cbe4aedcc2ae76c3f7018c195a780a5e4ef7ee487602cf0ac7fadff8b5c31b38a6e18f6a324947a1ae7e51f3c693bb65ae000ce6461a54969
data/CHANGELOG.md CHANGED
@@ -1,3 +1,3 @@
1
- ### 0.0.1 / 2019-04-16
2
-
3
- * Everything is new. First release
1
+ ### 0.0.1 / 2019-04-16
2
+
3
+ * Everything is new. First release
data/Manifest.txt CHANGED
@@ -1,11 +1,6 @@
1
1
  CHANGELOG.md
2
- LICENSE.md
3
2
  Manifest.txt
4
3
  README.md
5
4
  Rakefile
6
5
  lib/bytes.rb
7
6
  lib/bytes/version.rb
8
- test/helper.rb
9
- test/test_bytes.rb
10
- test/test_hash.rb
11
- test/test_string.rb
data/README.md CHANGED
@@ -1,14 +1,254 @@
1
-
2
1
  # Bytes
3
2
 
4
- bytes gem / library -
3
+ bytes - bits 'n' bytes made easy/easier incl. new buffer helper / wrapper class to help with the string byte vs character dichotomy
5
4
 
6
- * home :: [github.com/s6ruby/programming-bits-bytes](https://github.com/s6ruby/programming-bits-bytes)
7
- * bugs :: [github.com/s6ruby/programming-bits-bytes/issues](https://github.com/s6ruby/programming-bits-bytes/issues)
5
+ * home :: [github.com/rubycocos/core](https://github.com/rubycocos/core)
6
+ * bugs :: [github.com/rubycocos/core/issues](https://github.com/rubycocos/core/issues)
8
7
  * gem :: [rubygems.org/gems/bytes](https://rubygems.org/gems/bytes)
9
8
  * rdoc :: [rubydoc.info/gems/bytes](http://rubydoc.info/gems/bytes)
10
9
 
11
10
 
11
+ ## Background - Programming Bits, Bytes 'n' Blocks Step-by-Step Book / Guide
12
+
13
+ _Let's start with the three types of strings, that is, bytes, (string) buffers, and (frozen) strings, ..._
14
+
15
+
16
+ ### Byte vs. Character
17
+
18
+
19
+ #### What's a Byte?
20
+
21
+ A byte is a 8-bit integer number (that is, unsigned from 0 to 255 or
22
+ signed from -128 to 127 using 2's complement).
23
+ Example:
24
+
25
+ ``` ruby
26
+ 0b01000001 #=> 65 - base 2 - binary bits
27
+ 65 #=> 65 - base 10 - decimal numbers
28
+ 0x41 #=> 65 - base 16 - hexadecimal numbers
29
+ [0b01000001, 65, 0x41]
30
+ #=> [65, 65, 65]
31
+ ```
32
+
33
+ Or with conversions to 8-bit integer numbers. Example:
34
+
35
+ ``` ruby
36
+ "01000001".to_i(2) #=> 65
37
+ "65".to_i(10) #=> 65
38
+ "65".to_i #=> 65 - same as to_i(10)
39
+ "41".to_i(16) #=> 65
40
+ "0x41".to_i(16) #=> 65 - same as "41" - 0x hex prefix gets skipped
41
+ ["01000001".to_i(2), "65".to_i(10), "41".to_i(16)]
42
+ #=> [65, 65, 65]
43
+ ```
44
+
45
+ Note: `String#hex` is a built-in short-cut / alias for `String#to_i(16)`. Example:
46
+
47
+ ``` ruby
48
+ "41".hex #=> 65
49
+ "0x41".hex #=> 65 - same as "41" - 0x hex prefix gets
50
+ ```
51
+
52
+
53
+
54
+ #### What's a Character?
55
+
56
+ A character (or char) used to be a byte
57
+ and, thus, a string (array) of characters
58
+ was also an array of bytes. Example:
59
+
60
+ ``` ruby
61
+ ?A.ord #=> 65 - ASCII character
62
+ "A".ord #=> 65 - ASCII character
63
+ "\x41".ord #=> 65 - ASCII character
64
+ [?A.ord, "A".ord, "\x41".ord]
65
+ #=> [65, 65, 65]
66
+ ```
67
+
68
+
69
+
70
+ History Nostalgia Corner: ASCII 7-Bit Character Encoding
71
+
72
+ ![](i/us_ascii_code_chart.png)
73
+
74
+ > ASCII abbreviated from American Standard Code for Information Interchange,
75
+ > is a character encoding standard for electronic communication. ASCII codes
76
+ > represent text in computers, telecommunications equipment, and other devices.
77
+ > Most modern character-encoding schemes are based on ASCII,
78
+ > although they support many additional characters.
79
+ >
80
+ > ASCII is the traditional name for the encoding system; the Internet Assigned
81
+ > Numbers Authority (IANA) prefers the updated name US-ASCII, which clarifies
82
+ > that this system was developed in the US and based on the typographical
83
+ > symbols predominantly in use there.
84
+ >
85
+ > (Source: [ASCII @ Wikipedia](https://en.wikipedia.org/wiki/ASCII))
86
+
87
+
88
+
89
+ Nowadays a character can have one, two or even more bytes.
90
+ Let's try:
91
+
92
+ ``` ruby
93
+ ## Latin Capital Letter A (Unicode) - 1 Byte
94
+ "A".bytes #=> [65]
95
+ "\x41".bytes #=> [65] - same as "A"
96
+ "\u0041".bytes #=> [65]
97
+ "\u{41}".bytes #=> [65] - same as "\u0041" - leading zeros can be dropped
98
+ "A".bytes.size #=> 1
99
+ "A".chars.size #=> 1
100
+
101
+ ## Cyrillic Capital Letter A (Unicode) - 2 Bytes
102
+ "А".bytes #=> [208, 144]
103
+ "\u0410".bytes #=> [208, 144] - same "А"
104
+ "\u{410}".bytes #=> [208, 144] - same as "\u0410" - leading zeros can be dropped
105
+ "А".bytes.size #=> 2
106
+ "А".chars.size #=> 1
107
+
108
+ # Old Persian Number One (Unicode) - 4 Bytes
109
+ "𐏑".bytes #=> [240, 144, 143, 145]
110
+ "\u{103D1}".bytes #=> [240, 144, 143, 145]
111
+ "\u{103d1}".bytes #=> [240, 144, 143, 145] same as "\u{103D1}"
112
+ "𐏑".bytes.size #=> 4
113
+ "𐏑".chars.size #=> 1
114
+
115
+ # ...
116
+ ```
117
+
118
+
119
+
120
+ ### String of Bytes or String of Characters? Yes, Yes, Yes
121
+
122
+
123
+ In ruby the String class can morph into three types:
124
+
125
+ - Bytes
126
+ - Mutable String a.k.a String Buffer
127
+ - Immutable String a.k.a. Frozen String
128
+
129
+
130
+ #### Bytes / Binary
131
+
132
+
133
+ `String.new` or `"".b` creates new bytes, that is, a new binary string
134
+ buffer with the ASCII_8BIT encoding also known as BINARY.
135
+ Let's try:
136
+
137
+ ``` ruby
138
+ String.new.encoding #=> <Encoding::ASCII_8BIT>
139
+ String.new("".b).encoding #=> <Encoding::ASCII_8BIT>
140
+ "".b.encoding #=> <Encoding::ASCII_8BIT>
141
+
142
+ Encoding::BINARY == Encoding::ASCII_8BIT #=> true
143
+
144
+ # or using the "type-safe" Bytes class
145
+
146
+ Bytes.new.encoding #=> <Encoding::ASCII_8BIT>
147
+ Bytes.new("").encoding #=> <Encoding::ASCII_8BIT>
148
+ Bytes.new("abc").encoding #=> <Encoding::ASCII_8BIT>
149
+ Bytes.new("\x61\x62\x63").encoding #=> <Encoding::ASCII_8BIT>
150
+ ```
151
+
152
+
153
+
154
+ #### String Buffer
155
+
156
+ If you use `String.new("")` (note the `""` passed in) or
157
+ the string literal `""` that creates a new string buffer
158
+ with the default encoding (usually UTF-8).
159
+ Let's try:
160
+
161
+ ``` ruby
162
+ # encoding: utf-8
163
+ String.new("").encoding #=> <Encoding::UTF_8>
164
+ "".encoding #=> <Encoding::UTF_8>
165
+ ```
166
+
167
+ <!--
168
+
169
+ # or using the StringBuffer c'tor helper (returning a String)
170
+
171
+ StringBuffer.new.encoding #=> <Encoding::UTF_8>
172
+ StringBuffer.new("").encoding #=> <Encoding::UTF_8>
173
+ StringBuffer.new("abc").encoding #=> <Encoding::UTF_8>
174
+
175
+ -->
176
+
177
+
178
+ #### Frozen String
179
+
180
+ If you use the recommended `# frozen_string_literal: true` magic comment
181
+ or pragma you can automagically turn all string literals into
182
+ frozen (immutable) strings with the default encoding (usually UTF-8).
183
+ Let's try:
184
+
185
+ ``` ruby
186
+ # frozen_string_literal: true
187
+ "".frozen? #=> true
188
+ "Hello, World!".frozen? #=> true
189
+ String.new.frozen? #=> false
190
+ String.new("").frozen? #=> false
191
+ ```
192
+
193
+
194
+
195
+ <!--
196
+
197
+ ### Bytes
198
+
199
+ bytes from hexstring
200
+
201
+ bytes to hexstring
202
+
203
+ bytes from string
204
+
205
+ bytes to string
206
+
207
+ bytes to array of integers
208
+
209
+ bytes from array of integers
210
+
211
+
212
+
213
+ #### Bytes to Integer Numbers - Little-Endian vs Big-Endian
214
+
215
+ 4 byte unsigned integer -
216
+
217
+ Example - 1
218
+
219
+ bytes to integer
220
+
221
+ integer to bytes
222
+
223
+ Big-End first or Little-End first?
224
+ Least significant bit (lsm) or most significant bit (msb) first?
225
+
226
+
227
+
228
+
229
+ #### Bytes Helper
230
+
231
+
232
+
233
+ ### Buffer
234
+
235
+ #### Buffer Helper
236
+
237
+ -->
238
+
239
+
240
+
241
+
242
+ To be continued ...
243
+
244
+ ---
245
+
246
+
247
+
248
+
249
+
250
+
251
+
12
252
  ## Usage
13
253
 
14
254
  To be done
data/Rakefile CHANGED
@@ -1,29 +1,31 @@
1
- require 'hoe'
2
- require './lib/bytes/version.rb'
3
-
4
- Hoe.spec 'bytes' do
5
-
6
- self.version = Bytes::VERSION
7
-
8
- self.summary = "bytes"
9
- self.description = summary
10
-
11
- self.urls = ['https://github.com/s6ruby/programming-bits-bytes']
12
-
13
- self.author = 'Gerald Bauer'
14
- self.email = 'wwwmake@googlegroups.com'
15
-
16
- # switch extension to .markdown for gihub formatting
17
- self.readme_file = 'README.md'
18
- self.history_file = 'CHANGELOG.md'
19
-
20
- self.extra_deps = [
21
- ]
22
-
23
- self.licenses = ['Public Domain']
24
-
25
- self.spec_extras = {
26
- required_ruby_version: '>= 2.2.2'
27
- }
28
-
29
- end
1
+ require 'hoe'
2
+ require './lib/bytes/version.rb'
3
+
4
+
5
+ Hoe.spec 'bytes' do
6
+
7
+ self.version = Cocos::Module::Bytes::VERSION
8
+
9
+ self.summary = "bytes"
10
+ self.description = summary
11
+
12
+
13
+ self.urls = { home: 'https://github.com/rubycocos/core' }
14
+
15
+ self.author = 'Gerald Bauer'
16
+ self.email = 'wwwmake@googlegroups.com'
17
+
18
+ # switch extension to .markdown for gihub formatting
19
+ self.readme_file = 'README.md'
20
+ self.history_file = 'CHANGELOG.md'
21
+
22
+ self.extra_deps = [
23
+ ]
24
+
25
+ self.licenses = ['Public Domain']
26
+
27
+ self.spec_extras = {
28
+ required_ruby_version: '>= 2.2.2'
29
+ }
30
+
31
+ end
data/lib/bytes/version.rb CHANGED
@@ -1,24 +1,25 @@
1
- # encoding: utf-8
2
-
3
-
4
-
5
- class Bytes
6
-
7
- MAJOR = 0
8
- MINOR = 1
9
- PATCH = 0
10
- VERSION = [MAJOR,MINOR,PATCH].join('.')
11
-
12
- def self.version
13
- VERSION
14
- end
15
-
16
- def self.banner
17
- "bytes/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
18
- end
19
-
20
- def self.root
21
- "#{File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )}"
22
- end
23
-
24
- end # class Bytes
1
+
2
+ module Cocos
3
+ module Module
4
+ module Bytes
5
+
6
+ MAJOR = 0
7
+ MINOR = 2
8
+ PATCH = 0
9
+ VERSION = [MAJOR,MINOR,PATCH].join('.')
10
+
11
+ def self.version
12
+ VERSION
13
+ end
14
+
15
+ def self.banner
16
+ "bytes/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
17
+ end
18
+
19
+ def self.root
20
+ "#{File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )}"
21
+ end
22
+
23
+ end # module Bytes
24
+ end # module Module
25
+ end # module Cocos
data/lib/bytes.rb CHANGED
@@ -1,127 +1,140 @@
1
- # encoding: utf-8
2
-
3
- require 'pp'
4
- require 'digest'
5
-
6
-
7
- ## our own code
8
- require 'bytes/version' # note: let version always go first
9
-
10
-
11
- class Bytes
12
- def self.new( *args )
13
- String.new( *args ).b
14
- end
15
-
16
- def self.from_hex( hexstr )
17
- if ['0x', '0X'].include?( hexstr[0...2] )
18
- [hexstr[2..-1]].pack('H*') ## cut-of leading 0x or 0X if present
19
- else
20
- [hexstr].pack('H*')
21
- end
22
- end
23
-
24
- def self.to_hex( str )
25
- # note: unpack returns string with <Encoding:US-ASCII>
26
- # conver to default encoding
27
- ## todo/fix: do NOT hardcode UTF-8 - use default encoding - how?
28
- str.unpack('H*').first.encode("UTF-8")
29
- end
30
-
31
- def self.convert( *args )
32
- ## used by Bytes() in global Kernel converter method
33
- if args.size == 1
34
- if args[0].is_a? Array
35
- ## assume array of bytes
36
- ## to be done
37
- else ## assume String
38
- ## todo/fix: use coerce to_str if arg is NOT a string - why? why not?
39
- str = args[0]
40
- ##
41
- if str.encoding == Encoding::ASCII_8BIT
42
- ## assume it's binary data - use as is (no hexstring conversion)
43
- new( str ) ## todo/check: return str as-is (without new) - why? why not?
44
- else ## assume it's a hexstring
45
- from_hex( str )
46
- end
47
- end
48
- else
49
- ## todo/fix: throw argument error
50
- end
51
- end
52
- end
53
-
54
-
55
- class Buffer
56
- def self.new( *args )
57
- if args.size == 0
58
- ## note: use "" to always use default encoding (and NOT binary)
59
- String.new( "" )
60
- else
61
- String.new( *args )
62
- end
63
- end
64
- end
65
-
66
-
67
- module BytesHelper
68
- def hex_to_bytes( hexstr ) Bytes.from_hex( hexstr); end
69
- alias_method :h_to_b, :hex_to_bytes
70
- alias_method :htob, :hex_to_bytes
71
-
72
- def bytes_to_hex( str ) Bytes.to_hex( str ); end
73
- alias_method :b_to_h, :bytes_to_hex
74
- alias_method :btoh, :bytes_to_hex
75
- end
76
-
77
-
78
-
79
- class String
80
- def h_to_b() Bytes.from_hex( self ); end
81
- alias_method :htob, :h_to_b
82
-
83
- def b_to_h() Bytes.to_hex( self ); end ## add .b-like shortcut
84
- alias_method :btoh, :b_to_h
85
- alias_method :h, :b_to_h
86
- end
87
-
88
-
89
- module HashHelper
90
- def sha256( bytes )
91
- ## todo/fix: check bytes.encoding - warn if not BINARY!!!!
92
- Digest::SHA256.digest( bytes )
93
- end
94
-
95
- def ripemd160( bytes )
96
- ## todo/fix: check bytes.encoding - warn if not BINARY!!!!
97
- Digest::RMD160.digest( bytes )
98
- end
99
-
100
- def hash256( bytes )
101
- ## double - uses sha256(sha256())
102
- sha256(sha256( bytes ))
103
- end
104
-
105
- def hash160( bytes )
106
- ## double - uses ripemd160(sha256())
107
- ripemd160(sha256( bytes ))
108
- end
109
-
110
- ## convenience shortcut helpers
111
- def sha256hex( bytes ) Bytes.to_hex(sha256( bytes )); end
112
- def ripemd160hex( bytes ) Bytes.to_hex(ripemd160( bytes )); end
113
- def hash256( bytes ) Bytes.to_hex(hash256( bytes )); end
114
- def hash160( bytes ) Bytes.to_hex(hash160( bytes )); end
115
- end
116
-
117
- ## make "global" for now - check if there's a better way (include in Kernel) - why? why ot?
118
- include HashHelper
119
- include BytesHelper
120
-
121
-
122
-
123
- module Kernel
124
- def Bytes( *args ) Bytes.convert( *args ); end
125
- end
126
-
127
- puts Bytes.banner ## say hello
1
+ require 'pp'
2
+ require 'forwardable'
3
+
4
+
5
+ ## our own code
6
+ require_relative 'bytes/version' # note: let version always go first
7
+
8
+
9
+ module BytesHelper
10
+ def hex_to_bin( hex )
11
+ ## todo/fix: do an argument regex hex check!!!!
12
+ raise TypeError, "BytesHelper.hex_to_bin - non-hexadecimal digit found in >#{hex}<" unless is_hex?( hex )
13
+
14
+ ## note: assume pack always returns string with BINARY/ASCII-8BIT encoding!!!
15
+ if ['0x', '0X'].include?( hex[0,2] ) ## cut-of leading 0x or 0X if present
16
+ [hex[2..-1]].pack('H*')
17
+ else
18
+ [hex].pack('H*')
19
+ end
20
+ end
21
+ alias_method :hex_to_bytes, :hex_to_bin
22
+ alias_method :h_to_b, :hex_to_bin
23
+ alias_method :htob, :hex_to_bin
24
+
25
+
26
+ def bin_to_hex( bin )
27
+ # note: unpack returns string with <Encoding:US-ASCII>
28
+ # convert to default encoding
29
+ ## todo/fix: do NOT hardcode UTF-8 - use default encoding - why? why not?
30
+ hex = bin.unpack('H*').first
31
+ ## note: hexdigits/chars (0-9a-f) should be safe, that is, always ASCII-7BIT/UTF_8 with needing to change any char codes
32
+ hex.encode!( Encoding::UTF_8 )
33
+ hex
34
+ end
35
+ alias_method :bytes_to_hex, :bin_to_hex
36
+ alias_method :b_to_h, :bin_to_hex
37
+ alias_method :btoh, :bin_to_hex
38
+
39
+
40
+ ########
41
+ # more helpers
42
+ ## check if it is a hex (string)
43
+ ## - allow optiona 0x or 0X and allow abcdef and ABCDEF
44
+ HEX_RE = /\A(?:0x)?[0-9a-f]*\z/i
45
+ def is_hex?( str ) !HEX_RE.match( str ).nil?; end
46
+ end # module BytesHelper
47
+
48
+
49
+
50
+
51
+ class Bytes
52
+ extend BytesHelper
53
+ ## e.g. lets you use
54
+ ## Bytes.hex_to_bin( hex )
55
+ ## Bytes.bin_to_hex( bin ) etc.
56
+
57
+
58
+ def self.from_hex( hex ) new( hex_to_bin( hex ) ); end
59
+
60
+ ## "semantic" constructor for wrapping (binary) strings e.g. same as Bytes.new(bin)
61
+ def self.wrap( bin ) new( bin ); end
62
+
63
+
64
+ def initialize( bin=String.new )
65
+ ## note: for now will NOT dup(licate) passed in binary array
66
+ ## you only get a new binary array if no arg passed in e.g. Bytes.new
67
+ @bin = if bin.encoding != Encoding::ASCII_8BIT
68
+ puts "!! WARN - Bytes.new - BINARY/ASCII-8BIT encoding expected; got: #{bin.encoding} for string:"
69
+ pp bin
70
+
71
+ bin.b
72
+ else
73
+ bin
74
+ end
75
+ end
76
+
77
+
78
+ ## add more string methods - why? why not?
79
+ extend Forwardable
80
+ def_delegators :@bin, :encoding,
81
+ :size, :length
82
+
83
+
84
+ def to_s() Bytes.bin_to_hex( @bin ); end
85
+ alias_method :to_hex, :to_s
86
+
87
+ def b() @bin; end
88
+
89
+ ## add to_a alias for @bin.bytes() - why? why not?
90
+
91
+
92
+ def ==(other)
93
+ self.class == other.class && @bin == other.b
94
+ end
95
+
96
+
97
+
98
+ def self.convert( arg )
99
+ ## used by Bytes() in global Kernel converter method
100
+ if arg.is_a?( Bytes )
101
+ arg ## pass-through as is
102
+ elsif arg.is_a?( String )
103
+ ## todo/fix: use coerce to_str if arg is NOT a string - why? why not
104
+ ##
105
+ if arg.encoding == Encoding::ASCII_8BIT
106
+ ## assume it's binary data - use as is (no hexstring conversion)
107
+ Bytes.wrap( arg ) ## todo/check: return str as-is (without new) - why? why not?
108
+ else ## assume it's a hexstring
109
+ Bytes.from_hex( arg )
110
+ end
111
+ else
112
+ ## check for array or such e.g if arg.is_a? Array
113
+ ## raise TypeError - why? why not?
114
+ raise ArgumentError, "Bytes() expected String; got #{arg.class.name}"
115
+ end
116
+ end
117
+ end
118
+
119
+
120
+
121
+ class String
122
+ def to_hex() Bytes.bin_to_hex( self ); end
123
+ ## add more aliases e.g. bin_to_hex or btoh or b_to_h or such - why? why not?
124
+
125
+ ## note: built-in String#hex returns string converted
126
+ ## to Integer -same as String.to_i(16) !!!!
127
+ end
128
+
129
+
130
+
131
+
132
+ module Kernel
133
+ def Bytes( arg ) Bytes.convert( arg ); end
134
+ end
135
+
136
+
137
+
138
+
139
+
140
+ puts Cocos::Module::Bytes.banner ## say hello
metadata CHANGED
@@ -1,69 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bytes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-16 00:00:00.000000000 Z
11
+ date: 2022-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdoc
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '4.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '7'
20
23
  type: :development
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: '4.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '7'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: hoe
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: '3.16'
39
+ version: '3.23'
34
40
  type: :development
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
44
  - - "~>"
39
45
  - !ruby/object:Gem::Version
40
- version: '3.16'
46
+ version: '3.23'
41
47
  description: bytes
42
48
  email: wwwmake@googlegroups.com
43
49
  executables: []
44
50
  extensions: []
45
51
  extra_rdoc_files:
46
52
  - CHANGELOG.md
47
- - LICENSE.md
48
53
  - Manifest.txt
49
54
  - README.md
50
55
  files:
51
56
  - CHANGELOG.md
52
- - LICENSE.md
53
57
  - Manifest.txt
54
58
  - README.md
55
59
  - Rakefile
56
60
  - lib/bytes.rb
57
61
  - lib/bytes/version.rb
58
- - test/helper.rb
59
- - test/test_bytes.rb
60
- - test/test_hash.rb
61
- - test/test_string.rb
62
- homepage: https://github.com/s6ruby/programming-bits-bytes
62
+ homepage: https://github.com/rubycocos/core
63
63
  licenses:
64
64
  - Public Domain
65
65
  metadata: {}
66
- post_install_message:
66
+ post_install_message:
67
67
  rdoc_options:
68
68
  - "--main"
69
69
  - README.md
@@ -80,9 +80,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
80
  - !ruby/object:Gem::Version
81
81
  version: '0'
82
82
  requirements: []
83
- rubyforge_project:
84
- rubygems_version: 2.5.2
85
- signing_key:
83
+ rubygems_version: 3.3.7
84
+ signing_key:
86
85
  specification_version: 4
87
86
  summary: bytes
88
87
  test_files: []
data/LICENSE.md DELETED
@@ -1,116 +0,0 @@
1
- CC0 1.0 Universal
2
-
3
- Statement of Purpose
4
-
5
- The laws of most jurisdictions throughout the world automatically confer
6
- exclusive Copyright and Related Rights (defined below) upon the creator and
7
- subsequent owner(s) (each and all, an "owner") of an original work of
8
- authorship and/or a database (each, a "Work").
9
-
10
- Certain owners wish to permanently relinquish those rights to a Work for the
11
- purpose of contributing to a commons of creative, cultural and scientific
12
- works ("Commons") that the public can reliably and without fear of later
13
- claims of infringement build upon, modify, incorporate in other works, reuse
14
- and redistribute as freely as possible in any form whatsoever and for any
15
- purposes, including without limitation commercial purposes. These owners may
16
- contribute to the Commons to promote the ideal of a free culture and the
17
- further production of creative, cultural and scientific works, or to gain
18
- reputation or greater distribution for their Work in part through the use and
19
- efforts of others.
20
-
21
- For these and/or other purposes and motivations, and without any expectation
22
- of additional consideration or compensation, the person associating CC0 with a
23
- Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
24
- and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
25
- and publicly distribute the Work under its terms, with knowledge of his or her
26
- Copyright and Related Rights in the Work and the meaning and intended legal
27
- effect of CC0 on those rights.
28
-
29
- 1. Copyright and Related Rights. A Work made available under CC0 may be
30
- protected by copyright and related or neighboring rights ("Copyright and
31
- Related Rights"). Copyright and Related Rights include, but are not limited
32
- to, the following:
33
-
34
- i. the right to reproduce, adapt, distribute, perform, display, communicate,
35
- and translate a Work;
36
-
37
- ii. moral rights retained by the original author(s) and/or performer(s);
38
-
39
- iii. publicity and privacy rights pertaining to a person's image or likeness
40
- depicted in a Work;
41
-
42
- iv. rights protecting against unfair competition in regards to a Work,
43
- subject to the limitations in paragraph 4(a), below;
44
-
45
- v. rights protecting the extraction, dissemination, use and reuse of data in
46
- a Work;
47
-
48
- vi. database rights (such as those arising under Directive 96/9/EC of the
49
- European Parliament and of the Council of 11 March 1996 on the legal
50
- protection of databases, and under any national implementation thereof,
51
- including any amended or successor version of such directive); and
52
-
53
- vii. other similar, equivalent or corresponding rights throughout the world
54
- based on applicable law or treaty, and any national implementations thereof.
55
-
56
- 2. Waiver. To the greatest extent permitted by, but not in contravention of,
57
- applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
58
- unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
59
- and Related Rights and associated claims and causes of action, whether now
60
- known or unknown (including existing as well as future claims and causes of
61
- action), in the Work (i) in all territories worldwide, (ii) for the maximum
62
- duration provided by applicable law or treaty (including future time
63
- extensions), (iii) in any current or future medium and for any number of
64
- copies, and (iv) for any purpose whatsoever, including without limitation
65
- commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
66
- the Waiver for the benefit of each member of the public at large and to the
67
- detriment of Affirmer's heirs and successors, fully intending that such Waiver
68
- shall not be subject to revocation, rescission, cancellation, termination, or
69
- any other legal or equitable action to disrupt the quiet enjoyment of the Work
70
- by the public as contemplated by Affirmer's express Statement of Purpose.
71
-
72
- 3. Public License Fallback. Should any part of the Waiver for any reason be
73
- judged legally invalid or ineffective under applicable law, then the Waiver
74
- shall be preserved to the maximum extent permitted taking into account
75
- Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
76
- is so judged Affirmer hereby grants to each affected person a royalty-free,
77
- non transferable, non sublicensable, non exclusive, irrevocable and
78
- unconditional license to exercise Affirmer's Copyright and Related Rights in
79
- the Work (i) in all territories worldwide, (ii) for the maximum duration
80
- provided by applicable law or treaty (including future time extensions), (iii)
81
- in any current or future medium and for any number of copies, and (iv) for any
82
- purpose whatsoever, including without limitation commercial, advertising or
83
- promotional purposes (the "License"). The License shall be deemed effective as
84
- of the date CC0 was applied by Affirmer to the Work. Should any part of the
85
- License for any reason be judged legally invalid or ineffective under
86
- applicable law, such partial invalidity or ineffectiveness shall not
87
- invalidate the remainder of the License, and in such case Affirmer hereby
88
- affirms that he or she will not (i) exercise any of his or her remaining
89
- Copyright and Related Rights in the Work or (ii) assert any associated claims
90
- and causes of action with respect to the Work, in either case contrary to
91
- Affirmer's express Statement of Purpose.
92
-
93
- 4. Limitations and Disclaimers.
94
-
95
- a. No trademark or patent rights held by Affirmer are waived, abandoned,
96
- surrendered, licensed or otherwise affected by this document.
97
-
98
- b. Affirmer offers the Work as-is and makes no representations or warranties
99
- of any kind concerning the Work, express, implied, statutory or otherwise,
100
- including without limitation warranties of title, merchantability, fitness
101
- for a particular purpose, non infringement, or the absence of latent or
102
- other defects, accuracy, or the present or absence of errors, whether or not
103
- discoverable, all to the greatest extent permissible under applicable law.
104
-
105
- c. Affirmer disclaims responsibility for clearing rights of other persons
106
- that may apply to the Work or any use thereof, including without limitation
107
- any person's Copyright and Related Rights in the Work. Further, Affirmer
108
- disclaims responsibility for obtaining any necessary consents, permissions
109
- or other rights required for any use of the Work.
110
-
111
- d. Affirmer understands and acknowledges that Creative Commons is not a
112
- party to this document and has no duty or obligation with respect to this
113
- CC0 or use of the Work.
114
-
115
- For more information, please see
116
- <http://creativecommons.org/publicdomain/zero/1.0/
data/test/helper.rb DELETED
@@ -1,8 +0,0 @@
1
- ## minitest setup
2
-
3
- require 'minitest/autorun'
4
-
5
-
6
- ## our own code
7
-
8
- require 'bytes'
data/test/test_bytes.rb DELETED
@@ -1,46 +0,0 @@
1
- # encoding: utf-8
2
-
3
- ###
4
- # to run use
5
- # ruby -I ./lib -I ./test test/test_bytes.rb
6
-
7
-
8
- require 'helper'
9
-
10
-
11
- class TestBytes < MiniTest::Test
12
-
13
- def test_hex
14
- assert String.new( "6162") == Bytes.to_hex( "ab" )
15
- assert String.new( "6162") == bytes_to_hex( "ab" )
16
- assert String.new( "6162") == "ab".b_to_h
17
- assert String.new( "6162") == "ab".btoh
18
- assert String.new( "6162") == "ab".h
19
- assert String.new( "6162") == Bytes.to_hex( "\x61\x62" )
20
- assert String.new( "6162") == bytes_to_hex( "\x61\x62" )
21
- assert String.new( "6162") == "\x61\x62".b_to_h
22
- assert String.new( "6162") == "\x61\x62".btoh
23
- assert String.new( "6162") == "\x61\x62".h
24
- assert Encoding::UTF_8 == Bytes.to_hex( "ab" ).encoding
25
-
26
- assert Bytes.new( "ab" ) == Bytes.from_hex( "6162" )
27
- assert Bytes.new( "ab" ) == hex_to_bytes( "6162" )
28
- assert Bytes.new( "ab" ) == "6162".h_to_b
29
- assert Bytes.new( "ab" ) == "6162".htob
30
- assert Bytes.new( "ab" ) == Bytes.from_hex( "0x6162" )
31
- assert Bytes.new( "ab" ) == hex_to_bytes( "0x6162" )
32
- assert Bytes.new( "ab" ) == "0x6162".h_to_b
33
- assert Bytes.new( "ab" ) == "0x6162".htob
34
- assert Encoding::ASCII_8BIT == Bytes.from_hex( "6162" ).encoding
35
-
36
- assert Bytes.new( "ab" ) == Bytes( "6162" )
37
- assert Bytes.new( "ab" ) == Bytes( "0x6162" )
38
- assert Bytes.new( "6162" ) == Bytes( "6162".b )
39
- assert Bytes.new( "ab" ) == Bytes( "ab".b )
40
- assert Bytes.new( "ab") == Bytes( "\x61\x62".b )
41
- assert Encoding::ASCII_8BIT == Bytes( "6162" ).encoding
42
- assert Encoding::ASCII_8BIT == Bytes( "6162".b ).encoding
43
- assert Encoding::ASCII_8BIT == Bytes( "ab".b ).encoding
44
- end
45
-
46
- end # class TestBytes
data/test/test_hash.rb DELETED
@@ -1,41 +0,0 @@
1
- # encoding: utf-8
2
-
3
- ###
4
- # to run use
5
- # ruby -I ./lib -I ./test test/test_hash.rb
6
-
7
-
8
- require 'helper'
9
-
10
-
11
- class TestHash < MiniTest::Test
12
-
13
- def test_hash
14
- sha256_empty_hex = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
15
- sha256_empty_bytes = "\xE3\xB0\xC4B\x98\xFC\x1C\x14\x9A\xFB\xF4\xC8\x99o\xB9$'\xAEA\xE4d\x9B\x93L\xA4\x95\x99\exR\xB8U".b
16
-
17
- assert_equal sha256_empty_bytes, sha256( "" )
18
- assert_equal sha256_empty_bytes, sha256( Bytes.new )
19
-
20
- assert_equal sha256_empty_hex, Bytes.to_hex( sha256( "" ) )
21
- assert_equal sha256_empty_hex, bytes_to_hex( sha256( "" ) )
22
- assert_equal sha256_empty_hex, btoh( sha256( "" ) )
23
- assert_equal sha256_empty_hex, sha256( "" ).h
24
- assert_equal sha256_empty_hex, sha256hex( "" )
25
-
26
- ripemd160_empty_hex = "9c1185a5c5e9fc54612808977ee8f548b2258d31"
27
-
28
- assert_equal ripemd160_empty_hex, Bytes.to_hex( ripemd160( "" ))
29
- assert_equal ripemd160_empty_hex, bytes_to_hex( ripemd160( "" ))
30
- assert_equal ripemd160_empty_hex, btoh( ripemd160( "" ))
31
- assert_equal ripemd160_empty_hex, ripemd160( "" ).h
32
- assert_equal ripemd160_empty_hex, ripemd160hex( "" )
33
-
34
- assert_equal "37f332f68db77bd9d7edd4969571ad671cf9dd3b",
35
- ripemd160hex( "The quick brown fox jumps over the lazy dog" )
36
-
37
- assert_equal "132072df690933835eb8b6ad0b77e7b6f14acad7",
38
- ripemd160hex( "The quick brown fox jumps over the lazy cog" )
39
- end
40
-
41
- end # class TestHash
data/test/test_string.rb DELETED
@@ -1,49 +0,0 @@
1
- # encoding: utf-8
2
-
3
- ###
4
- # to run use
5
- # ruby -I ./lib -I ./test test/test_string.rb
6
-
7
-
8
- require 'helper'
9
-
10
-
11
- class TestString < MiniTest::Test
12
-
13
- def test_string
14
- ####
15
- # note: 1) String.new gets you String with "binary" encoding
16
- # 2) String Literal "" and String.new("")
17
- # gets you String with default encoding (utf-8)
18
-
19
- assert Encoding::ASCII_8BIT == String.new.encoding
20
- assert Encoding::ASCII_8BIT == String.new("".b).encoding
21
- assert Encoding::ASCII_8BIT == "".b.encoding
22
-
23
- assert Encoding::BINARY == Encoding::ASCII_8BIT
24
- assert Encoding::BINARY == String.new.encoding
25
- assert Encoding::BINARY == String.new("".b).encoding
26
- assert Encoding::BINARY == "".b.encoding
27
-
28
- assert Encoding::UTF_8 == "".encoding
29
- assert Encoding::UTF_8 == String.new("").encoding
30
- end
31
-
32
- def test_bytes
33
- assert Encoding::ASCII_8BIT == Bytes.new.encoding
34
- assert Encoding::ASCII_8BIT == Bytes.new("").encoding
35
- assert Encoding::ASCII_8BIT == Bytes.new("ab").encoding
36
-
37
- assert Encoding::BINARY == Encoding::ASCII_8BIT
38
- assert Encoding::BINARY == Bytes.new.encoding
39
- assert Encoding::BINARY == Bytes.new("").encoding
40
- assert Encoding::BINARY == Bytes.new("ab").encoding
41
- end
42
-
43
- def test_buffer
44
- assert Encoding::UTF_8 == Buffer.new.encoding
45
- assert Encoding::UTF_8 == Buffer.new("").encoding
46
- assert Encoding::UTF_8 == Buffer.new("ab").encoding
47
- end
48
-
49
- end # class TestString