- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
好的,我看过一些文章here和 here ,但他们没有做我需要做的事情,我遇到了一些麻烦。
我正在接收一段作为内存流的加密数据。我需要以某种方式将内存流写入文件(我编写模型的方式,最好是字符串),然后从文件中检索字符串并将其作为内存流发送到要解密的服务。我只是使用流读取器将内存流存储为字符串,并使用编码将字符串读入内存。
问题是我收到一条错误消息,提示我的加密数据已损坏。我认为这意味着我以某种方式更改了字节。
这是将内存流读入字符串的代码:
using (StreamReader reader = new StreamReader(dataKeyResponse.CiphertextBlob))
{
encryptedDataKey = reader.ReadToEnd();
}
下面是将从文件中检索到的字符串读取到内存流中的代码:
MemoryStream mStream = new MemoryStream(ASCIIEncoding.Default.GetBytes(encryptedKey));
我以为完成它的步骤是 ASCIIEncoding,但后来我实现了 the workaround from above ,将字节数组转换为内存流,并得到相同的错误。
byte[] bytes = new byte[encryptedKey.Length*sizeof (char)];
System.Buffer.BlockCopy(encryptedKey.ToCharArray(), 0, bytes, 0, bytes.Length);
string decryptedKey;
using (MemoryStream mStream = new MemoryStream())
{
mStream.Write(bytes, 0, bytes.Length);
var decryptRequest = new DecryptRequest()
{CiphertextBlob = mStream};
var decryptResponse = client.Decrypt(decryptRequest);
using (StreamReader reader = new StreamReader(decryptResponse.Plaintext))
{
decryptedKey = reader.ReadToEnd();
}
}
我假设 (1) 有一些东西以某种方式改变了数据,而不是其他错误; (2) 是在stream -> string or string -> stream transition,而不是string -> file or string <- file transition; (3) 传入和传出数据的完美副本将解决问题——传入的数据应该是“明文”加密版本;也许有人期望我对流入和流出的流进行编码(编码甚至会更改数据吗?我是从 post 判断的)。
无论是确认字节应该等同于进出,还是捕获文件中的内存流并在不更改任何内容的情况下将其发回,都将是很棒的。
最佳答案
假设您的 MemoryStream 包含以下输入数据:[0x01, 0x02, 0x03, 0x04]当您使用 streamreader 读取它时,您的字符串的二进制表示将是:[0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04],因为字符串使用两个字节表示一个字符。之后您要做的是为“字节”变量分配 8 个字节而不是 4 个字节,并用第二个(修改后的)数据填充它。您可以使用 Convert.ToBase64String() 获取字符串表示形式,也可以使用 FromBase64String() 将其解析回来。像这样:
var testData = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
var inputStream = new MemoryStream(testData);
var inputAsString = Convert.ToBase64String(inputStream.ToArray());
Console.WriteLine(inputAsString);
var outputStream = new MemoryStream(Convert.FromBase64String(inputAsString));
var result = BitConverter.ToString(outputStream.ToArray());
Console.WriteLine(result);
关于c# - MemoryStream 到 String,然后返回到 MemoryStream,而不添加任何字节(编码等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30517771/
到目前为止,我已经生成了以下代码来尝试将相关数据整合在一起。 但是,使用“+ 7”函数会产生以下问题。 Registration date = '2018-01-01' 它正在推迟 2018-04-0
我已经成功地将我的自定义购物车发布到 PayPal——它处理订单非常漂亮,当收到付款时,它会将数据发回我在配置中指定的 URL。代码基于此处找到的库:http://www.phpfour.com/bl
我是一名优秀的程序员,十分优秀!