131 lines
4.3 KiB
Ruby
131 lines
4.3 KiB
Ruby
# encoding: ascii-8bit
|
|
#
|
|
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
#
|
|
|
|
module Thrift
|
|
# A collection of utilities for working with bytes and byte buffers.
|
|
module Bytes
|
|
if RUBY_VERSION >= '1.9'
|
|
# Creates and empty byte buffer (String with BINARY encoding)
|
|
#
|
|
# size - The Integer size of the buffer (default: nil) to create
|
|
#
|
|
# Returns a String with BINARY encoding, filled with null characters
|
|
# if size is greater than zero
|
|
def self.empty_byte_buffer(size = nil)
|
|
if (size && size > 0)
|
|
"\0".force_encoding(Encoding::BINARY) * size
|
|
else
|
|
''.force_encoding(Encoding::BINARY)
|
|
end
|
|
end
|
|
|
|
# Forces the encoding of the buffer to BINARY. If the buffer
|
|
# passed is frozen, then it will be duplicated.
|
|
#
|
|
# buffer - The String to force the encoding of.
|
|
#
|
|
# Returns the String passed with an encoding of BINARY; returned
|
|
# String may be a duplicate.
|
|
def self.force_binary_encoding(buffer)
|
|
buffer = buffer.dup if buffer.frozen?
|
|
buffer.force_encoding(Encoding::BINARY)
|
|
end
|
|
|
|
# Gets the byte value of a given position in a String.
|
|
#
|
|
# string - The String to retrive the byte value from.
|
|
# index - The Integer location of the byte value to retrieve.
|
|
#
|
|
# Returns an Integer value between 0 and 255.
|
|
def self.get_string_byte(string, index)
|
|
string.getbyte(index)
|
|
end
|
|
|
|
# Sets the byte value given to a given index in a String.
|
|
#
|
|
# string - The String to set the byte value in.
|
|
# index - The Integer location to set the byte value at.
|
|
# byte - The Integer value (0 to 255) to set in the string.
|
|
#
|
|
# Returns an Integer value of the byte value to set.
|
|
def self.set_string_byte(string, index, byte)
|
|
string.setbyte(index, byte)
|
|
end
|
|
|
|
# Converts the given String to a UTF-8 byte buffer.
|
|
#
|
|
# string - The String to convert.
|
|
#
|
|
# Returns a new String with BINARY encoding, containing the UTF-8
|
|
# bytes of the original string.
|
|
def self.convert_to_utf8_byte_buffer(string)
|
|
if string.encoding != Encoding::UTF_8
|
|
# transcode to UTF-8
|
|
string = string.encode(Encoding::UTF_8)
|
|
else
|
|
# encoding is already UTF-8, but a duplicate is needed
|
|
string = string.dup
|
|
end
|
|
string.force_encoding(Encoding::BINARY)
|
|
end
|
|
|
|
# Converts the given UTF-8 byte buffer into a String
|
|
#
|
|
# utf8_buffer - A String, with BINARY encoding, containing UTF-8 bytes
|
|
#
|
|
# Returns a new String with UTF-8 encoding,
|
|
def self.convert_to_string(utf8_buffer)
|
|
# duplicate the buffer, force encoding to UTF-8
|
|
utf8_buffer.dup.force_encoding(Encoding::UTF_8)
|
|
end
|
|
else
|
|
def self.empty_byte_buffer(size = nil)
|
|
if (size && size > 0)
|
|
"\0" * size
|
|
else
|
|
''
|
|
end
|
|
end
|
|
|
|
def self.force_binary_encoding(buffer)
|
|
buffer
|
|
end
|
|
|
|
def self.get_string_byte(string, index)
|
|
string[index]
|
|
end
|
|
|
|
def self.set_string_byte(string, index, byte)
|
|
string[index] = byte
|
|
end
|
|
|
|
def self.convert_to_utf8_byte_buffer(string)
|
|
# This assumes $KCODE is 'UTF8'/'U', which would mean the String is already a UTF-8 byte buffer
|
|
# TODO consider handling other $KCODE values and transcoding with iconv
|
|
string
|
|
end
|
|
|
|
def self.convert_to_string(utf8_buffer)
|
|
# See comment in 'convert_to_utf8_byte_buffer' for relevant assumptions.
|
|
utf8_buffer
|
|
end
|
|
end
|
|
end
|
|
end
|