# 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