Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将base64映像与InputStream进行比较_Java_Junit_Base64_Inputstream - Fatal编程技术网

Java 将base64映像与InputStream进行比较

Java 将base64映像与InputStream进行比较,java,junit,base64,inputstream,Java,Junit,Base64,Inputstream,我正在测试我的android应用程序。 在setUp()上,我创建了3个联系人,其中两个有照片。插入的第一个联系人和最后一个联系人都有一张照片。联系人的信息通过JSON对象接收,图像以base64编码 我有95%的把握这两张图片是一样的,我只是用解码得到了我期待的图片 在tearDown()上,我正在删除联系人 我被一种特殊的方法困住了。这个: public void testGetContactPhotoInputStream() { try { String pho

我正在测试我的android应用程序。 在
setUp()
上,我创建了3个联系人,其中两个有照片。插入的第一个联系人和最后一个联系人都有一张照片。联系人的信息通过
JSON对象
接收,图像以
base64编码

我有95%的把握这两张图片是一样的,我只是用解码得到了我期待的图片

tearDown()
上,我正在删除联系人

我被一种特殊的方法困住了。这个:

public void testGetContactPhotoInputStream() {

    try {
        String photoBase64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeIAAAC2CAIAAACK4xmhAAAABmJLR0Q(...)";
        String rawContactId = getAllRawContactIds().get(0);

        photo.setRawContactId(rawContactId);

        InputStream isExpected = photo.getContactPhotoInputStream();

        InputStream isActual = new ByteArrayInputStream(Base64.decode(photoBase64.getBytes(), Base64.DEFAULT));

        assertTrue(IOUtils.contentEquals(isExpected, isActual));

    } catch (IOException e) {
        e.printStackTrace();
        fail("Exception: " + e.getMessage());
    } 
}
它正在从
Photo
类测试此方法

public InputStream getContactPhotoInputStream() throws IOException {
    Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(mRawContactId));
    InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, uri);

    return is;
}
我确信照片是一样的,因为base64编码是接收到的
JSON
中的字符串

我试过:

String photoBase64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeIAAAC2CAIAAACK4xmhAAAABmJLR0QA/wD/AP(...)";
没有“data:image/png…”的初始部分,如下所示:

String photoBase64 = "iVBORw0KGgoAAAANSUhEUgAAAeIAAAC2CAIAAACK4xmhAAAABmJLR0QA/wD/AP(...)";
仍然获取失败的断言

这是我的
断言
输出:

junit.framework.AssertionFailedError
at com.pedro.notesquirrel.test.PhotoTest.testGetContactPhotoInputStream(PhotoTest.java:178)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)
我认为问题在于转换为
InputStream
,但我看不出断言失败的任何原因

有什么帮助吗

聚苯乙烯;为了便于阅读,我删除了大部分的
photoBase64
字符串

///////////EDIT/////////////////strong>

以下是Joop Eggen的评论,以下是我的代码:

public void testGetContactPhotoInputStream() {
try {

    String photoBase64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeIAAAC2CAIAAACK4xmhAAA(...)";
    String contactId = getAllContactIds().get(0);
    String rawContactId = contact.getAllRawContactIdsBelongingToGivenContactId(contactId).get(0);

    photo.setRawContactId(rawContactId);

    photoBase64 = photoBase64.replaceFirst("^.*;base64,", "");
    Log.d(TAG, "Data: " + photoBase64);
    byte[] bytes = Base64.decode(photoBase64, Base64.DEFAULT);

    InputStream isActual = new ByteArrayInputStream(bytes);
    InputStream isExpected = photo.getContactPhotoInputStream();

    assertTrue(IOUtils.contentEquals(isExpected, isActual));

    } catch (IOException e) {
        e.printStackTrace();
        fail("Exception: " + e.getMessage());
    }       
}
“data:image/png;base64”部分不属于真正的base64数据

String base64Text = photoBase64.replaceFirst("^.*,", "");
byte[] bytes = Base64.decode(base64Text , Base64.DEFAULT);

好吧,我们“眼睛”的图像是相等的(不完全相等,因为你可以看到一些模糊的像素),但Android内部确实降低了图像质量,使其与原始图像不匹配。因此,单元测试失败。

执行此转换。@JoopEggen我已尝试按照您的建议进行操作,但仍然无法进行资产评估。我用你评论中的代码编辑了我的问题。Android没有类
DatatypeConverter
,它有
Base64
类。检查图像中存储的元信息,可能它们已更改。2.做一个十六进制转储并比较它们。是的,你是对的。Android确实改变了图像。它会降低图像质量,使其与原始图像不匹配。我知道,在这两种情况下,为了让我安心,我测试了有无“data:image/png;base64”,但都不起作用。我最终得到了我的
输入流isExpected
编码为base64并对其进行了分析。我的结论是,
InputStream是预期的
不是我应该得到的,因此测试按预期失败。感谢您的帮助和投入,代表给予!