在java

时间:2015-07-09 12:31:40

标签: java c# base64 interop endianness

我想将文件从C#传输到接受base64字符串的java webservice。问题是,当我使用c#Convert类对文件进行编码时,它会根据一个小的无符号字节[]生成一个字符串。

在Java byte []中是signed / big endian。当我解码传送的字符串时,我得到一个不同的字节[],因此文件已损坏。

如何将C#中的byte []编码为base64,它等于使用相同字符串在java中解码的byte []?

C#方:

byte[] attachment = File.ReadAllBytes(@"c:\temp\test.pdf");
String attachmentBase64 = Convert.ToBase64String(attachment, Base64FormattingOptions.None);

Java方面:

  @POST
  @Path("/localpdf")
  @Consumes("text/xml")
  @Produces("text/xml")
  public String getExtractedDataFromEncodedPdf(@FormParam("file") String base64String) {

      if(base64String == null) return null;


      byte[] data = Base64.decodeBase64(base64String.getBytes());

      FileOutputStream ms;
    try {
        ms = new FileOutputStream(new File("C:\\Temp\\test1234.pdf"));
        ms.write(data);
        ms.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

文件test1234.pdf已损坏。

1 个答案:

答案 0 :(得分:1)

"签名"和#34; big-endian"是非常不同的事情,我相信你会让自己感到困惑。

是的,字节用Java签名并且在C#中没有签名 - 但是我强烈怀疑你在两种情况下都得到了相同的实际位...它只是一点点(例如)11111111在C#中表示255,在Java中表示-1。除非您将字节视为数字(这很少有用),否则它无关紧要 - 如果您只是使用字节来写出来,那肯定没有关系Java端的文件。