如何将保存为字符串(base64?)的数组对象转换为C#数组或sql表?
我有一个用Ruby开发的遗留代码,它将数组作为字符串保存在数据库中,我希望在迁移到新环境时对其进行解码 遗留Ruby代码:如何将保存为字符串(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,
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;y valInt=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;
}