在 Post 请求之前将字节数组转换为 C# 字节数组



我必须构建一个JSON对象,它将如下所示:

{
"sessionId": "DA2F5102377742BE8063ADBC8968A294",
"documentId": "c2f84034-ea1c-4406-8a8b-ab2c00a1b537",
"sourceFile": {
"MimeType": "application/pdf",
"SourceFile": [
25,
68,
56,...
]
}

为此,我创建了 2 个 POJO:

@Component
@Getter @Setter
@AllArgsConstructor @NoArgsConstructor
public class UpdateSourceFileRequestModel {
private String sessionId;
private ReportingDataRequestModel reportingData;
private String documentId;
private DocumentSourceFileRequestModel sourceFile;
}

和:

@Component
@Getter @Setter
@AllArgsConstructor @NoArgsConstructor
public class DocumentSourceFileRequestModel {
// for GettingSourceFile
@SerializedName("MimeType")
private String mimeType;
@SerializedName("SourceFile")
private int[] sourceFile;
}

我必须使用序列化名称,因为 JSON 区分大小写。到目前为止一切顺利,一切都很好。

现在,我正在尝试将pdf文件转换为字节数组。可以通过读取文件轻松完成:

byte[] array = Files.readAllBytes(Paths.get(fileToReturn));

我的问题是我必须返回一个 C# 字节数组(从 0 到 255 的无符号数字(。 为了解决这个问题,我尝试了这个:

int[] result = new int[array.length];
for(int i = 0; i < array.length; i++)   {
int posInt = array[i] & 0xFF;
byte bValue = (byte) posInt;
result[i] = bValue;
}

我复制了一个有符号字节数组 (-128 +127( 并将其转换为 int 数组(0 到 255(,以匹配 API 的要求。此代码是在堆栈溢出上找到的。我的问题是转换后的文件无法使用杂技演员读取。

这是整个方法代码:

private void updateSourceFile(String fileToReturn, LogOnWithPassword2RestResponseModel login) throws IOException {
System.out.println("nSending HTTP POST request - returning file process");
// retrieve the file
Path path = Paths.get(fileToReturn);
File f = path.toFile();
// convert file to byte array
byte[] array = Files.readAllBytes(Paths.get(fileToReturn));
int[] result = new int[array.length];
for(int i = 0; i < array.length; i++)   {
int posInt = array[i] & 0xFF;
byte anotherB = (byte) posInt;
result[i] =anotherB;
}
UpdateSourceFileRequestModel updateSourceFileRequestModel = new UpdateSourceFileRequestModel();
DocumentSourceFileRequestModel documentSourceFileRequestModel = new DocumentSourceFileRequestModel();
documentSourceFileRequestModel.setMimeType("application/pdf");
documentSourceFileRequestModel.setSourceFile(result);
updateSourceFileRequestModel.setSessionId(login.getD().getSessionId());
updateSourceFileRequestModel.setDocumentId(docId);
updateSourceFileRequestModel.setSourceFile(documentSourceFileRequestModel);
updateSourceFileRequestModel.setReportingData(null);
String url = "http://localhost/TotalAgility/Services/SDK/CaptureDocumentService.svc/json/UpdateSourceFile";
Gson gson = new GsonBuilder().setPrettyPrinting().create();
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(url);
String jsonInputString = gson.toJson(updateSourceFileRequestModel);
StringEntity postingString = new StringEntity(jsonInputString);
post.setEntity(postingString);
post.setHeader("Content-type", "application/json");
post.setHeader("accept", "application/json");
HttpResponse response = httpClient.execute(post);
}

这些行:

byte bValue = (byte) posInt;
result[i] = bValue;

违背转换为整数的目的,因为您实际上获取整数结果(通常为>127(并将其转换回字节(这将导致负值再次超过 127(。由于问题是正确转换为没有负值的 json,因此绝对不要在将其转换为整数后再次将其转换为字节。

这很好:

int[] result = new int[array.length];
for(int i = 0; i < array.length; i++)   {
result[i] = array[i] & 0xFF;
}

我认为您正在使用一个函数从 C# 转换为 Java,而您需要相反的东西:从 Java 字节到 C# 字节。如果要转换为 0-255 值并将其存储在有符号整数中,请尝试在每个字节中添加 256:

int[] result = new int[array.length];
for(int i = 0; i < array.length; i++)   {
int uByte = array[i] + 256;
result[i] = uByte;
}

我也测试了这个:

byte[] array = Files.readAllBytes(Paths.get(fileToReturn));
int[] result = new int[array.length];
for(int i = 0; i < array.length; i++)   {
if(array[i] < 0) {
result[i] = Byte.MAX_VALUE - array[i];
} else {
result[i] = array[i];
}
}

那工作正常

最新更新