【问题标题】:Not a valid Base-64 string as it contains a non-base 64 character, or an illegal character不是有效的 Base-64 字符串,因为它包含非 base 64 字符或非法字符
【发布时间】:2018-02-09 08:08:23
【问题描述】:

我的字符串 xml 如下 我没有放置完整的字符串,因为它太长了

目前我的代码是

    public Package GetDeliveryConfirmationLabel(Package package)
    {
        string labeldate = package.ShipDate.ToShortDateString();
        if (package.ShipDate.ToShortDateString() == DateTime.Now.ToShortDateString()) 
            labeldate = "";
           string url= "https://secure.shippingapis.com/ShippingAPI.dll?API=PriorityMailIntlCertify&XML= <PriorityMailIntlCertifyRequest USERID=\"XXXXX\"> <Option></Option> <Revision>2</Revision> <ImageParameters> <ImageParameter>4X6LABEL</ImageParameter> </ImageParameters> <FromFirstName>Garth</FromFirstName> <FromMiddleInitial>A</FromMiddleInitial> <FromLastName>Brooks</FromLastName> <FromFirm>Garths Firm</FromFirm> <FromAddress1>radlab</FromAddress1> <FromAddress2>6406 Ivy Lane</FromAddress2> <FromUrbanization>Garys Urbanization</FromUrbanization> <FromCity>Greenbelt</FromCity> <FromState>MD</FromState> <FromZip5>20770</FromZip5> <FromZip4>1234</FromZip4> <FromPhone>3019187658</FromPhone> <FromCustomsReference> From Customs Ref.</FromCustomsReference> <ToName></ToName> <ToFirstName>Reza</ToFirstName> <ToLastName>Dianat</ToLastName> <ToFirm>HP</ToFirm> <ToAddress1>HP</ToAddress1> <ToAddress2>5th floor</ToAddress2> <ToAddress3>6406 Flower Lane</ToAddress3> <ToCity>Greenbelt</ToCity> <ToProvince>Md</ToProvince> <ToCountry>Canada</ToCountry> <ToPostalCode>20770</ToPostalCode> <ToPOBoxFlag>N</ToPOBoxFlag> <ToPhone>5555555555</ToPhone> <ToFax>3012929999</ToFax> <ToEmail>b@aol.com</ToEmail> <ToCustomsReference>Import Reference</ToCustomsReference> <NonDeliveryOption>Return</NonDeliveryOption> <Container>MDFLATRATEBOX</Container> <ShippingContents> <ItemDetail> <Description>Description 1</Description> <Quantity>1</Quantity> <Value>1.11</Value> <NetPounds>1</NetPounds> <NetOunces>1</NetOunces> <HSTariffNumber>123456789123</HSTariffNumber> <CountryOfOrigin>Brazil</CountryOfOrigin> </ItemDetail> <ItemDetail> <Description>Description 2</Description> <Quantity>2</Quantity> <Value>2.22</Value> <NetPounds></NetPounds> <NetOunces>2</NetOunces> <HSTariffNumber>234567</HSTariffNumber> <CountryOfOrigin>Switzerland</CountryOfOrigin> </ItemDetail> <ItemDetail> <Description>Description 3</Description> <Quantity>3</Quantity> <Value>3.33</Value> <NetPounds></NetPounds> <NetOunces>3</NetOunces> <HSTariffNumber>123456789123</HSTariffNumber> <CountryOfOrigin>Brazil</CountryOfOrigin> </ItemDetail> <ItemDetail> <Description>Description 4</Description> <Quantity>4</Quantity> <Value>4.44</Value> <NetPounds></NetPounds> <NetOunces>4</NetOunces> <HSTariffNumber>234567234567</HSTariffNumber> <CountryOfOrigin>Switzerland</CountryOfOrigin> </ItemDetail> </ShippingContents> <Insured>N</Insured> <InsuredNumber>90123</InsuredNumber> <InsuredAmount>99.90</InsuredAmount> <GrossPounds>3</GrossPounds> <GrossOunces>8</GrossOunces> <ContentType>Documents</ContentType> <ContentTypeOther>and Other</ContentTypeOther> <Agreement>Y</Agreement> <Comments>PriorityMailIntl Comments</Comments> <LicenseNumber>Lic 123</LicenseNumber> <CertificateNumber>Cert456</CertificateNumber> <InvoiceNumber>Inv890</InvoiceNumber> <ImageType>TIF</ImageType> <ImageLayout>TRIMONEPERFILE</ImageLayout> <CustomerRefNo>Cust Ref123</CustomerRefNo> <POZipCode>20770</POZipCode> <LabelDate></LabelDate> <HoldForManifest>N</HoldForManifest> <EELPFC>802.11B</EELPFC> <CommercialPrice></CommercialPrice> <Size></Size> <Length></Length> <Width></Width> <Height></Height> <Girth></Girth> <ExtraServices> <ExtraService></ExtraService> </ExtraServices> </PriorityMailIntlCertifyRequest>"; 

         string xml = web.DownloadString(url);
        if (xml.Contains("<Error>"))
        {
            int idx1 = xml.IndexOf("<Description>") + 13;
            int idx2 = xml.IndexOf("</Description>");
            int l = xml.Length;
            string errDesc = xml.Substring(idx1, idx2 - idx1);
            package.Error = errDesc;
            //throw new USPSManagerException(errDesc);
        }
        else
        {
            int i1 = xml.IndexOf("<LabelImage>") + "<LabelImage>".Length;
            int i2 = xml.IndexOf("</LabelImage>");
            package.ShippingLabel = Convert.FromBase64String(xml.Substring(i1, i2 - i1));

            XmlDocument xmldoc = new XmlDocument();
            xmldoc.LoadXml(xml);
            XmlNodeList nodeList = xmldoc.GetElementsByTagName("LabelImage");
            string _DeliveryConfirmationNumber = string.Empty;
            foreach (XmlNode node in nodeList)
            {
                _DeliveryConfirmationNumber = node.InnerText;
            }
            package.ReferenceNumber = _DeliveryConfirmationNumber;
        }
        return package;
    }   

在实现此代码时,我需要生成文件,但它的错误看起来像

图片错误是

【问题讨论】:

  • 仅从您的措辞和函数名称来看,我猜您调用了错误的函数:“我正在尝试转换为 base 64”与 FromBase64String
  • 1.请显示错误信息。 2.你看过实际的子串吗?
  • 您的 xml 字符串不包含 PriorityMailIntlCertifyResponse...
  • 情况变得更糟了。当然现在改代码一定会抛出这个异常,xml字符串显然不是一个有效的base64字符串。
  • 问题是试图解码不是 base64 字符串的 base64 字符串。检查您的输入以获取真正的字符串

标签: c# xml base64


【解决方案1】:

问题是您没有获取返回响应的正确部分(您不能查找PriorityMailIntlCertifyResponse 标记,而是LabelImage)。试试这个:

int i1 = xml.IndexOf("<LabelImage>") + "<LabelImage>".Length;
int i2 = xml.IndexOf("</LabelImage>");
Byte[] vbf = Convert.FromBase64String(xml.Substring(i1,i2-i1));

编辑

根据@Fildor 的评论,最好使用 XmlDocument 来获取图像:

XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(xml);
var imageBase64  = xmldoc.GetElementsByTagName("LabelImage").Item(0).InnerText;
Byte[] image= Convert.FromBase64String(imageBase64);

【讨论】:

  • 我仍然更喜欢在代码中使用他正在使用的 xmlDocument。我不明白他为什么要从一开始就在弦上工作。恕我直言,使用 XPath 来获取该值会更有意义。
  • 我也是@Fildor。但是由于 OP 使用 Substring 来获取 base64 字符串,我在我的回答中使用它:)
  • 没错,只是说... :) 只是 - 我不知道那个 XML 的架构。所以 xml.IndexOf("") 可能不会让他得到正确的...
  • @Fildor 已按原样编辑 :) 是的,它是 &lt;LabelImage&gt;,我已经尝试使用从该 api 返回的 xml
  • 对不起@Xtremcool,但这不是一个问题更新,应该是一个新问题。你不能继续编辑你的问题来改变它。
猜你喜欢
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
相关资源
最近更新 更多