Oracle 12c 等效于 C# Encoding.ASCII.GetBytes
Posted
技术标签:
【中文标题】Oracle 12c 等效于 C# Encoding.ASCII.GetBytes【英文标题】:Oracle 12c equivalent to C# Encoding.ASCII.GetBytes 【发布时间】:2020-10-31 15:30:46 【问题描述】:我正在尝试模仿 Oracle 12c 中的 C# 函数 Encoding.ASCII.GetBytes。我快到了,但不知道为什么会得到以下结果:
甲骨文
declare
l_string varchar2(4000) := 'Test';
begin
dbms_output.put_line(utl_raw.cast_to_raw(l_string));
end;
由此产生的输出是:
54657374
C#
internal static string ConvertTest()
var inputString = "Test";
Console.WriteLine(BitConverter.ToString(Encoding.ASCII.GetBytes(inputString)));
由此产生的输出是:
54-65-73-74
所以我似乎快到了,但我不明白为什么 C# 在每个字节之间有“-”而 Oracle 没有。
是否有一个 Oracle 函数可以复制 C# 的输出?
谢谢。
【问题讨论】:
不知道有没有别的函数,不过你可以用regexp_replace(rawstr,'(..)(..)(..)','\1-\2-\3-')
格式化一下。
【参考方案1】:
utl_raw.cast_to_raw 不会在每个字符的字节码之间放置“-”。我认为没有直接的方法可以获取预期格式的一系列字节码。
一种解决方法是,循环遍历每个字符并在每次迭代后附加“-”。
示例代码 -
declare
l_string varchar2(4000) := 'Test';
l_result varchar2(4000) := '';
begin
for idx in 1 .. length(l_string)
loop
l_result := l_result || utl_raw.cast_to_raw(SUBSTR(l_string,idx,1));
if idx != length(l_string) then
l_result := l_result || '-';
end if;
end loop;
dbms_output.put_line(l_result);
end;
【讨论】:
感谢您的回答,但我需要我的输出是原始的,因为我需要在之后进行进一步的哈希处理。我尝试了类似的方法,但与您的解决方案一样,我最终得到了 varchar2 的输出。【参考方案2】:我想我追错了!
utl_raw.cast_to_raw 等价于 Encoding.ASCII.GetBytes()。 BitConverter.ToString 实际上是在每个字节之间插入“-”。
感谢您的帮助!
【讨论】:
以上是关于Oracle 12c 等效于 C# Encoding.ASCII.GetBytes的主要内容,如果未能解决你的问题,请参考以下文章