我有一个用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,但是值不匹配
答案 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;
}