如何将保存为字符串(base64?)的数组对象转换为C#数组或sql表?

如何将保存为字符串(base64?)的数组对象转换为C#数组或sql表?,c#,ruby-on-rails,sql-server,ruby,C#,Ruby On Rails,Sql Server,Ruby,我有一个用Ruby开发的遗留代码,它将数组作为字符串保存在数据库中,我希望在迁移到新环境时对其进行解码 遗留Ruby代码: class CatalogoConjunto include DataMapper::Resource ... property :coordenadas, Object ... ... def save_depois if (coordenadas.length > 1 and coordenadas.include?([0,

我有一个用Ruby开发的遗留代码,它将数组作为字符串保存在数据库中,我希望在迁移到新环境时对其进行解码

遗留Ruby代码:

class CatalogoConjunto
  include DataMapper::Resource

  ...
  property :coordenadas, Object
  ...

  ...

  def save_depois
    if (coordenadas.length > 1 and coordenadas.include?([0, 0]) rescue false)
      self.coordenadas = coordenadas - [[0, 0]]
      save!
    end
  end

  def save
    save = super
    save_depois
    save
  end

  ...
end
采样保存在列coordenadas中的内容: “BAhbCFsHaQHYaQIDAVsHaQLZAWkCwwFbB2kB8WkCXQI=”

其他样本: “BAhbBlsHaQHRaQI6AQ==”,“Bahbblshaqlmakb3a==”,“Bahbb1shaqkmakb81Shaqika2kbvq==”

如何找到编码方法

新应用程序使用C#,数据迁移正在SQL中完成。。。但是任何给我指明前进方向的光线都已经帮助了我

鲁比让我迷路了

编辑

字符串“bahblshaqj6a2kciwi=”代表此值(890547)

但是使用下面的代码,我得到了字符串“egmaacmcaa=”

尝试使用C进行转换#

int[,]test=newint[,]{{{890547};
字节[]结果=新字节[test.Length*sizeof(int)];
块复制(测试,0,结果,0,结果,长度);
var anotherString=Convert.ToBase64String(结果);
Console.WriteLine(另一个字符串);
var stringFromDatabase=“bahblshaqj6a2kciwi=”;
byte[]byteArray=Convert.FromBase64String(stringFromDatabase);
//不工作
int[,]newArr=newint[byteArray.Length/sizeof(int)/2+((byteArray.Length/sizeof(int))%2),2];
对于(int-ctr=0;ctr

Ruby生成的字符串看起来像Base64,但值不匹配

DataMapper有一个默认的bahavior来处理数据类型对象:

经过一些研究,在这里发现了一篇关于Marshall在Ruby中如何工作的帖子:

我只需要这些数字,我做了一个简单的解码,只是寻找整数

public static List<int> Conversor(string stringFromDatabase)
{
    byte[] byteArray = Convert.FromBase64String(stringFromDatabase);

    List<int> retorno = new List<int>();

    for (int i = 0; i < byteArray.Length; i++)
    {
        if ((char)byteArray[i] == (char)105)
        {
            int valInt = 0;
            int primeiroByte = Convert.ToInt32(byteArray[i + 1]);
            if (primeiroByte == 0)
                retorno.Add(0);
            else if (primeiroByte > 4)
                retorno.Add(primeiroByte - 5);
            else if (primeiroByte > 0 && primeiroByte < 5)
            {
                valInt = byteArray[i + 2];
                for (int y = 1; y < primeiroByte; y++)
                {
                    valInt = valInt | (byteArray[i + 2 + y] << 8 * y);
                }
                retorno.Add(valInt);
            }

        }
    }

    return retorno;
}
公共静态列表对话器(字符串stringFromDatabase)
{
byte[]byteArray=Convert.FromBase64String(stringFromDatabase);
列表编号=新列表();
for(int i=0;i4)
添加(primeiroByte-5);
else if(primeiroByte>0&&primeiroByte<5)
{
valInt=byteArray[i+2];
对于(int y=1;yvalInt=valInt |(byteArray[i+2+y]如果你没有使用Ruby代码,为什么你甚至需要“转换”任何东西。你的问题似乎只是问如何将Base64字符串转换为C#数组。你的代码没有出现(至少你发布的代码)编码/解码任何东西,因为我们不知道
save
super
做什么。Base64不是Ruby,而是它自己的东西,大多数语言,包括C#都有它的功能。它是基本的字符串编码,广泛用于XML、HTML等,作为确保所有字符“合法”的统一方式并提供一些压缩。C#在中很容易访问。正如我所说,您的Ruby代码完全没有显示Base64编码。最好的猜测是
save
方法中的
super
可能会做些什么,但您没有显示出来。
Object
没有
save
函数,因此您使用的任何代码都必须总而言之,你的问题“如何在Ruby中保存”是不可能得到答案的根据您所给出的。很可能它根本不是Base64,或者字符串编码没有被处理,尽管UTF-8将是标准。再看看,它根本不是Base64。您的示例字符串的格式不正确Base64。您的第一个示例解码为
[[junk1[junk2[junk3]
“如果非猜不可,这是一个二进制文件数组,在一对方括号内有一个开方括号用作分隔符。但其他数组的末尾没有一个闭方括号。因此我猜这样做的方法是遍历字节数组,忽略最初的开方括号,然后使用任何其他的”[”作为分隔符,它们之间的所有内容都作为二进制数据,需要以某种方式转换为整数。
public static List<int> Conversor(string stringFromDatabase)
{
    byte[] byteArray = Convert.FromBase64String(stringFromDatabase);

    List<int> retorno = new List<int>();

    for (int i = 0; i < byteArray.Length; i++)
    {
        if ((char)byteArray[i] == (char)105)
        {
            int valInt = 0;
            int primeiroByte = Convert.ToInt32(byteArray[i + 1]);
            if (primeiroByte == 0)
                retorno.Add(0);
            else if (primeiroByte > 4)
                retorno.Add(primeiroByte - 5);
            else if (primeiroByte > 0 && primeiroByte < 5)
            {
                valInt = byteArray[i + 2];
                for (int y = 1; y < primeiroByte; y++)
                {
                    valInt = valInt | (byteArray[i + 2 + y] << 8 * y);
                }
                retorno.Add(valInt);
            }

        }
    }

    return retorno;
}