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的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 12C:插入值后返回记录

C# 等效于 Java 标点正则表达式

C# 等效于 AtlEscapeUrl

C# 等效于 Apache HttpAsyncClient

C# 等效于 VB DLL 函数声明 (InternetSetOption)?

C# 等效于 Java 的 Arrays.fill() 方法[重复]