编辑:我相信问题出在base64中,并且已经根据我工作的谷歌表格版本中的控制字符串检查了我的输出,它们在base64编码后有所不同,我只是不明白为什么。
控制字符串:{“产品”:[{“id”:“606625996”,“数量”:“2”,“选项”:{“尺寸”:“10英寸”}},{“id”:“606625996” ","数量":"6","选项":{"尺寸":"6 英寸"}}]}
功能输出: JTDCJTIychJvZHVjdHMlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMjYwNjYyNTk5NiUyMiUyQyUyMnF1YW50aXR5JTIyJTNBJTIyMiUyMiUyQyUyMm9wdGlvbnMlMjilM0ElN0IlMjJzaXplJ TIYJTNBJTIyMTALMjBpbmNoJTIyJTdEJTdEJTJDJTdCJTIyaWQlMjIlM0ElMjiI2MDY2MjU5OTYlMjIlMkMlMjJxdWFudGl0eSUyMiUzQSUyMjYlMjIlMkMlMjJvcHRpb25zJTIyJTNBJTdCJ TIyc2l6ZSUyMiUzQSUyMjYlMjBpbmNoJTIyJTdEJTdEJTVEJTdE
控制台应用程序的非功能输出: JTDCJTIychJvZHVjdHMlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMjYwNjYyNTk5NiUyMiUyQyUyMnF1YW50aXR5JTIyJTNBJTIyMiUyMiUyQyUyMm9wdGlvbnMlMjilM0ElN0IlMjJzaXplJ TIYJTNBJTIYMTALMjBpbmNoJTIyJTdEJTdEJTJDJTdCJTIychHJvZHVjdHMlMjIlM0ElNUILN0IlMjJpZCUyMiUzQSUyMjYwNjYyNTk5NiUyMiUyQyUyMnF1YW50aXR5JTIyJTNBJTIyNiUyMiUy QyUyMm9wdGlvbnMlMjIlM0ElN0IlMjJzaXplJTIyJTNBJTIyNiUyMGluY2glMjIlN0QlN0QlNUQlN0A=
qt 应用程序的非功能输出: JTDCJTIychJvZHVjdHMlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMjYwNjYyNTk5NiUyMiUyQyUyMnF1YW50aXR5JTIyJTNBJTIyMiUyMiUyQyUyMm9wdGlvbnMlMjilM0ElN0IlMjJzaXplJ TIYJTNBJTIYMTALMjBpbmNoJTIyJTdEJTdEJTJDJTdCJTIychHJvZHVjdHMlMjIlM0ElNUILN0IlMjJpZCUyMiUzQSUyMjYwNjYyNTk5NiUyMiUyQyUyMnF1YW50aXR5JTIyJTNBJTIyNiUyMiUy QyUyMm9wdGlvbnMlMjIlM0ElN0IlMjJzaXplJTIyJTNBJTIyNiUyMGluY2glMjIlN0QlN0QlNUQlN0Q=
编辑结束:
我已经为我的网站编写了一些可购买链接的代码。当我在谷歌表格中执行相同的步骤时,它每次都完美运行,但是当我编写应用程序时,有些东西不起作用,我有点不知所措。该代码是从我使用的另一个免费程序进行逆向工程的,该程序的输出始终存在错误,为了解决这个问题,我解码了输出,它(据我所知)是这种格式的 json {" products":[{"id":"intern.id #","quantity":"#","options":{"type":"option name"}}]} 删除最后两个字符并添加一个逗号作为下一组添加的同一模板之间的分隔符,即{"products":[{"id":"intern.id #","quantity":"#","options":{"type":"选项名称"}},{"产品":[{"id":"实习生 id #","数量":"#","选项":{"类型":"选项名称"}}]}。然后所有这些都是百分比编码的,所以它看起来像 %5B%7B%22id%22%3A%22intern.+id+%23%22%2C%22quantity%22%3A%22%23%22%2C%22options %22%3A%7B%22type%22%3A%22选项+名称%22%7D%7D%2C%7B%22产品%22%3A%5B%7B%22id%22%3A%22intern.+id+%23% 22%2C%22quantity%22%3A%22%23%22%2C%22options%22%3A%7B%22type%22%3A%22option+name%22%7D%7D%5D%7D,然后就是最后了
用base64编码,正如我所说,我在谷歌表格中构建了这个应用程序,但它的大小是有限的,因为谷歌表格只能这么大,但我可以在c ++和qt中非常轻松地做到这一点,并且有一个非常简单易于使用的应用程序。如果我能弄清楚有什么不同。我还应该说这段代码会打开购物车,但不会填充任何东西,或者在某些情况下只填充列表中的第一个东西,我不明白为什么
这是我的驱动程序代码:
#include<iostream>
#include<fstream>
#include<sstream>
#include<list>
#include<string>
#include<base64.h>
#include<encoder.h>
#include<infoFind.h>
#include<escapencode.h>
using namespace std;
int main()
{
list <string> choices;
string done="";
string internid="";
string quant="";
string type="";
string option="";
string open="https://www.sustainhydro.com/online-store/!/~/cart/create=";
string body1="{\"products\":[{\"id\":\"";
string body2="\",\"quantity\":\"";
string body3="\",\"options\":{\"";
string body4="\":\"";
string body5="\"}}";
string close="]}";
string delim=",";
string temp="";
string comp="";
string input="";
while (done != "n")
{
catinfo();
cout<< "" << '\n';
cout << "Enter Internal Id: ";
cin >> internid;
cout << "Enter Quantity: ";
cin >> quant;
cout << "Enter Type: ";
cin >> type;
cout << "Enter Option: ";
cin.ignore();
getline(cin,option);
cout <<""<<'\n';
cout << "Do you have another SKU: y , n : ";
cin >> done;
temp=body1+internid+body2+quant+body3+type+body4+option+body5;
choices.push_back(temp);
choices.push_back(delim);
if (done == "y")
{
continue;
}
if (done == "n")
{
choices.pop_back();
choices.push_back(close);
for (auto i : choices)
{
comp+=i;
}
if (!comp.empty() && (comp.back() == '\n' || comp.back() == '\0'))
{
comp.pop_back();
}
comp = escape(comp);
cout << comp << endl;
comp=base64_encode(comp);
cout << comp << endl;
cout << '\n';
cout << "THIS IS YOUR URL:" << endl;
cout << '\n';
cout << open;
cout << comp;
cout << "" << '\n';
cout << "" << '\n';
cout << "Copy and Paste the URL From Here";
cout << "" << '\n';
break;
}
}
return 0;
}
要遵循的自定义头文件:
转义编码.h
#include<iterator>
#include<algorithm>
#include<iostream>
#include<string>
#include<list>
using namespace std;
string space="%20";
string colon="%3A";
string bracko="%5B";
string brackc="%5D";
string braceo="%7B";
string bracec="%7D";
string quote="%22";
string comma="%2C";
string escape(string json)
{
list<string>temp;
string result="";
char chr;
for(char i : json)
{
chr=i;
string newchr(1,chr);
if(newchr == "[")
{
newchr=bracko;
}
if(newchr == "]")
{
newchr=brackc;
}
if(newchr == " ")
{
newchr=space;
}
if(newchr == ":")
{
newchr=colon;
}
if(newchr == "{")
{
newchr=braceo;
}
if(newchr == "}")
{
newchr=bracec;
}
if(newchr == "\"")
{
newchr=quote;
}
if(newchr == ",")
{
newchr=comma;
}
temp.push_back(newchr);
}
for(string i : temp)
{
result=result+i;
}
return result;
}
base64.h
#include <algorithm>
#include <array>
#include <cctype>
#include <string>
const std::array<char, 64> base64_chars = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
};
std::string base64_encode(const std::string& input) {
std::string output;
int val = 0, valb = -6;
for (unsigned char c : input) {
val = (val << 8) + c;
valb += 8;
while (valb >= 0) {
output.push_back(base64_chars[(val >> valb) & 0x3F]);
valb -= 6;
}
}
if (valb > -6) output.push_back(base64_chars[(val << (6 + valb)) & 0x3F]);
while (output.size() % 4) output.push_back('=');
return output;
}
我的 qt 版本中也发生了同样的事情,并且我也在我的 qt 代码中使用了此控制台应用程序中的一些代码,如果需要,我也可以包含该代码,我只是不想在这里啰嗦,我感觉我可能已经有了。还有桌上的卡片我不是网络专家或网站设计师,我也不是最好的编码员,我知道就行业而言我是一个糟糕的编码员。
正如预期的那样,正常运行的 Base64 字符串解码为:
{
"products": [
{
"id": "606625996",
"quantity": "2",
"options": {
"size": "10 inch"
}
},
{
"id": "606625996",
"quantity": "6",
"options": {
"size": "6 inch"
}
}
]
}
您的控制台应用程序最后会生成无效的
%7@
。如果我删除它,我仍然有无效的 JSON,无论是语法上(缺少 }}
)还是语义上(你的第二个产品是 {products: PRODUCT}
而不是 PRODUCT
)。