首页 \ 问答 \ Base64编码省略了最后2个字节(Base64 encoding omits final 2 bytes)

Base64编码省略了最后2个字节(Base64 encoding omits final 2 bytes)

此代码将位图编码为Base64。 出于调试目的,我还写了几行来将所有数据放入普通文件中。 问题是文件不同:文件直接从位图保存:

DB 5A C4 80 00 00

从解码的b64数据中保存的文件:

DB 5A C4 80

所以在编码/解码后2个字节MIA正确的文件是第一个,因为它可以通过chrome,图像查看器等轻松打开。我的代码:

Bitmap exportedBitmap = Bitmap.createBitmap(EXPORTED_IMAGE_SIZE, EXPORTED_IMAGE_SIZE, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(exportedBitmap);
float imageViewRatio = EXPORTED_IMAGE_SIZE / (float) getWidth();

canvas.save();
canvas.scale(imageViewRatio, imageViewRatio);
drawPhoto(canvas, mScale);
canvas.restore();



ByteArrayOutputStream outStream = new ByteArrayOutputStream(512000);
Base64OutputStream base64OutputStream = new Base64OutputStream(outStream, Base64.DEFAULT);

String timeString = new Date().toString();
File outputFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "origin"+ timeString +".webp");
if (!outputFile.exists())
{
    outputFile.delete();
}
outputFile.createNewFile();
FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
TeeOutputStream teeOutputStream = new TeeOutputStream(base64OutputStream, fileOutputStream);



exportedBitmap.compress(Bitmap.CompressFormat.WEBP, 85, teeOutputStream);

getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(outputFile)));

exportedBitmap.recycle();
teeOutputStream.flush();
String outString = outStream.toString();
teeOutputStream.close();


decodeDataToFile(timeString, outString);

并且保存解码文件方法(仅供参考 - 在不同平台后端服务上也是错误的结果):

private void decodeDataToFile(String pTimeString, String pOutString) throws IOException
{
    File decodedFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "processed" + pTimeString + ".webp");
    decodedFile.createNewFile();
    FileOutputStream decodedFileOutputStream = new FileOutputStream(decodedFile);
    decodedFileOutputStream.write(Base64.decode(pOutString, Base64.DEFAULT));

    decodedFileOutputStream.flush();
    decodedFileOutputStream.close();
    getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(decodedFile)));
}

This code is going to encode a bitmap to Base64. For debugging purposes I've written also few lines to put all the data into ordinary files. Problem is that files are different: File saved directly from bitmap:

DB 5A C4 80 00 00

file saved from decoded b64 data:

DB 5A C4 80

So after encode/decode 2 bytes MIA The right file is the first one as it can be easily opened by chrome, image viewers etc. My code:

Bitmap exportedBitmap = Bitmap.createBitmap(EXPORTED_IMAGE_SIZE, EXPORTED_IMAGE_SIZE, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(exportedBitmap);
float imageViewRatio = EXPORTED_IMAGE_SIZE / (float) getWidth();

canvas.save();
canvas.scale(imageViewRatio, imageViewRatio);
drawPhoto(canvas, mScale);
canvas.restore();



ByteArrayOutputStream outStream = new ByteArrayOutputStream(512000);
Base64OutputStream base64OutputStream = new Base64OutputStream(outStream, Base64.DEFAULT);

String timeString = new Date().toString();
File outputFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "origin"+ timeString +".webp");
if (!outputFile.exists())
{
    outputFile.delete();
}
outputFile.createNewFile();
FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
TeeOutputStream teeOutputStream = new TeeOutputStream(base64OutputStream, fileOutputStream);



exportedBitmap.compress(Bitmap.CompressFormat.WEBP, 85, teeOutputStream);

getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(outputFile)));

exportedBitmap.recycle();
teeOutputStream.flush();
String outString = outStream.toString();
teeOutputStream.close();


decodeDataToFile(timeString, outString);

And the save decoded file method (just for reference - result of this is wrong also on different platform back end service):

private void decodeDataToFile(String pTimeString, String pOutString) throws IOException
{
    File decodedFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "processed" + pTimeString + ".webp");
    decodedFile.createNewFile();
    FileOutputStream decodedFileOutputStream = new FileOutputStream(decodedFile);
    decodedFileOutputStream.write(Base64.decode(pOutString, Base64.DEFAULT));

    decodedFileOutputStream.flush();
    decodedFileOutputStream.close();
    getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(decodedFile)));
}

原文:https://stackoverflow.com/questions/30444520
更新时间:2022-11-09 09:11

最满意答案

我能够传入maps.apple.com并使用字符串地址作为对象来查询url。

<%= link_to "#{transferred_from_address(call)} Click to map", "http://maps.apple.com/?q=#{transferred_from_address(call)}", :class => 'btn btn-success btn-medium' %>

I was able to pass in maps.apple.com and use a the string address as an object to query the url.

<%= link_to "#{transferred_from_address(call)} Click to map", "http://maps.apple.com/?q=#{transferred_from_address(call)}", :class => 'btn btn-success btn-medium' %>

相关问答

更多

相关文章

更多

最新问答

更多
  • 获取MVC 4使用的DisplayMode后缀(Get the DisplayMode Suffix being used by MVC 4)
  • 如何通过引用返回对象?(How is returning an object by reference possible?)
  • 矩阵如何存储在内存中?(How are matrices stored in memory?)
  • 每个请求的Java新会话?(Java New Session For Each Request?)
  • css:浮动div中重叠的标题h1(css: overlapping headlines h1 in floated divs)
  • 无论图像如何,Caffe预测同一类(Caffe predicts same class regardless of image)
  • xcode语法颜色编码解释?(xcode syntax color coding explained?)
  • 在Access 2010 Runtime中使用Office 2000校对工具(Use Office 2000 proofing tools in Access 2010 Runtime)
  • 从单独的Web主机将图像传输到服务器上(Getting images onto server from separate web host)
  • 从旧版本复制文件并保留它们(旧/新版本)(Copy a file from old revision and keep both of them (old / new revision))
  • 西安哪有PLC可控制编程的培训
  • 在Entity Framework中选择基类(Select base class in Entity Framework)
  • 在Android中出现错误“数据集和渲染器应该不为null,并且应该具有相同数量的系列”(Error “Dataset and renderer should be not null and should have the same number of series” in Android)
  • 电脑二级VF有什么用
  • Datamapper Ruby如何添加Hook方法(Datamapper Ruby How to add Hook Method)
  • 金华英语角.
  • 手机软件如何制作
  • 用于Android webview中图像保存的上下文菜单(Context Menu for Image Saving in an Android webview)
  • 注意:未定义的偏移量:PHP(Notice: Undefined offset: PHP)
  • 如何读R中的大数据集[复制](How to read large dataset in R [duplicate])
  • Unity 5 Heighmap与地形宽度/地形长度的分辨率关系?(Unity 5 Heighmap Resolution relationship to terrain width / terrain length?)
  • 如何通知PipedOutputStream线程写入最后一个字节的PipedInputStream线程?(How to notify PipedInputStream thread that PipedOutputStream thread has written last byte?)
  • python的访问器方法有哪些
  • DeviceNetworkInformation:哪个是哪个?(DeviceNetworkInformation: Which is which?)
  • 在Ruby中对组合进行排序(Sorting a combination in Ruby)
  • 网站开发的流程?
  • 使用Zend Framework 2中的JOIN sql检索数据(Retrieve data using JOIN sql in Zend Framework 2)
  • 条带格式类型格式模式编号无法正常工作(Stripes format type format pattern number not working properly)
  • 透明度错误IE11(Transparency bug IE11)
  • linux的基本操作命令。。。