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

时间:2018-08-10 19:54:50

标签: c# ruby-on-rails sql-server ruby

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

旧版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 ==”,“ BAhbBlsHaQLMAmkB3A ==”,“ BAhbB1sHaQKmAmkB81sHaQIkA2kBvQ ==”

如何找到编码方法?

新应用程序使用C#,并且正在使用SQL进行数据迁移...但是向我展示前进方向的任何信息都已经对我有所帮助...

Ruby让我很失落。

修改

字符串“ BAhbBlsHaQJ6A2kCIwI =”代表此值(890,547)。

但使用以下代码,我得到字符串“ egMAACMCAAA =“

尝试使用C#进行转换

int[,] test = new int[,] { { 890, 547 } };

byte[] result = new byte[test.Length * sizeof(int)];
Buffer.BlockCopy(test, 0, result, 0, result.Length);

var anotherString =  Convert.ToBase64String(result);

Console.WriteLine(anotherString);



var stringFromDatabase = "BAhbBlsHaQJ6A2kCIwI= ";

byte[] byteArray = Convert.FromBase64String(stringFromDatabase);

//Don't work
int[,] newArr = new int[byteArray.Length / sizeof(int)/2 + ((byteArray.Length / sizeof(int))%2), 2];
for (int ctr = 0; ctr < byteArray.Length / sizeof(int); ctr++)
{
    if (ctr % 2 != 0)
    {
        newArr[ctr/2, 0] = BitConverter.ToInt32(byteArray, ctr * sizeof(int));
    }
    else
    {
        newArr[ctr/2, 1] = BitConverter.ToInt32(byteArray, ctr * sizeof(int));
    }
}

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

1 个答案:

答案 0 :(得分:0)

DataMapper具有将数据类型编组为对象的默认行为:

https://github.com/datamapper/dm-core/blob/master/lib/dm-core/property/object.rb

经过一些研究后,在这里找到了有关Marshall在Ruby中的工作方式的帖子:

https://ilyabylich.svbtle.com/ruby-marshalling-from-a-to-z

我只需要一个数字即可,我只需要寻找整数就可以对其进行简单解码

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;
}