IQ中得到字符串的十六进制形式

Sybase IQ和ASE中都有函数ascii,返回字符串表达式中第一个字节的整数 ASCII 值!

那么, 如何获得字符串的十六进制形式呢?

比如:以GBK编码的三个汉字“数据库”的十六进制形式为:0xcafdbeddbfe2

可以验证一下: select char(hextoint('ca')) + char(hextoint('fd')) , char(hextoint('be')) + char(hextoint('dd')),char(hextoint('bf')) + char(hextoint('e2'))

本文提供两种方法,主要涉及到的函数有: substring,ascii,inttohex,right,list,string以及sa_rowgenerator系统过程。

第一种方法:

编写成自定义函数的形式

create function Hex(@str varchar(8192))
returns varchar(8192)
--返回字符的十六进制形式
as
begin
  declare @len int,@i int,@strhex varchar(16384)
  select @i=1,@len=len(@str),@strhex=''
  while( @i<=@len )
  begin
    select @strhex=@strhex + right( inttohex( ascii( substring(@str,@i,1) ) ), 2 )
    select @i=@i+1
  end
  select @strhex='0x'+@strhex
  return @strhex
end
go

第二种方法:

使用一条SQL语句就能够实现。主要依赖于sa_rowgenerator系统过程以及list函数。

sa_rowgenerator 返回包含指定起始值和结束值之间的行的结果集。
语法:sa_rowgenerator ( [ rstart [, rend [, rstep ] ] ])

1> select row_num from sa_rowgenerator(1,10,2)
2> go
 row_num    
 -----------
           1
           3
           5
           7
           9

(5 rows affected)

--得到系统表SYSTABLE的所有列名的列表,用逗号分隔。

1> select list(column_name,',') as column_list  from syscolumn where table_id=1
2> go
 column_list                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 table_id,file_id,count,first_page,last_page,primary_root,creator,first_ext_page,last_ext_page,table_page_count,ext_page_count,table_name,table_type,view_def,remarks,replicate,existing_obj,remote_location,remote_objtype,srvid,server_type,primary_hash_limit,page_map_start,source                                                                                                                                                                                                                                           

(1 row affected)

下面的SQL直接返回“数据库”三个汉字的十六进制形式:

select string('0x', list( right(inttohex(ascii(substring('数据库',row_num,1))),2) , '' ) ) from sa_rowgenerator(1,len('数据库'))

将“数据库”两次出现的位置替换成其它字符串,就能得到指定字符串的十六进制形式。

  • 本文链接地址:https://www.dbainfo.net/iq-transfer-strings-to-hex.htm
  • 本文为dbainfo个人原创,请在尊重作者劳动成果的前提下进行转载;
  • 转载务必注明原始出处 : Sybase数据库技术,数据库恢复专家
  • 对《IQ中得到字符串的十六进制形式》有何疑问或见解,请在本文下方发表;
  • 对网站还有其他问题或建议,请提交在留言板,谢谢!
  • 目前还没有任何评论.
    :wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)