【问题标题】:Oracle 12c equivalent to C# Encoding.ASCII.GetBytesOracle 12c 等效于 C# Encoding.ASCII.GetBytes
【发布时间】:2023-03-08 22:30:02
【问题描述】:

我正在尝试模仿 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-')格式化一下。

标签: c# sql oracle visual-studio


【解决方案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 实际上是在每个字节之间插入“-”。

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2011-05-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    相关资源
    最近更新 更多