Eu fiz uma pergunta sobre a conversão de campos COMP, para os quais não obtive resposta.
Espero que o estouro de pilha possa me ajudar nessa questão.
Consegui converter o COMP-3 em decimal. Eu preciso de sua ajuda para converter o decimal descompactado de volta para o COMP-3, em qualquer linguagem de programação de alto nível, mas de preferência em Java ou c # .net.
Em decimal compactado -123 é representado como X’123d ‘(o último nyble c, d ou f sendo o sinal). Uma das maneiras mais simples de manipular o decimal compactado é simplesmente converter os bytes em uma cadeia hexadecimal (ou vice-versa, conforme necessário) e, em seguida, usar a manipulação normal de cadeias de caracteres. Isso pode não ser o mais eficiente, mas é fácil de implementar.
Então, para converter um número inteiro (valor) em decimal empacotado é aproximadamente (nota: eu não testei o código)
String sign = "c"; if (value < 0) { sign = "d"; value = -1 * value; } String val = value + "d" byte[] comp3Bytes = new BigInteger(val, 16).toByteArray();
A seguir estão alguns códigos de exemplo para conversão de / para comp3 Para recuperar um decimal compactado de uma matriz de bytes, consulte o método getMainframePackedDecimal em http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src /net/sf/JRecord/Common/Conversion.java?revision=3&view=markup
e para definir um decimal compactado, consulte setField em http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Types/TypePackedDecimal.java?revision=3&view = marcação
ambas as rotinas tomam uma matriz de bytes, uma posição inicial e um comprimento de uma posição de campo.
Há outros exemplos de fazer isso na web (JRanch, acho que tem código para fazer a conversão também), fazer um pouco de googling.
A conversão do decimal zoneado para o comp-3 é bastante fácil – inverta os nibbles do byte baixo e remova o nibble alto de todos os outros bytes.
Considere o número 12345 – em notação decimal compactada, que seria um x’12345C ‘ou x’12345F’ (C e F são +, AB e D são -). Quando você converteu para decimal zoneado, você inverteu o nibble baixo e inseriu um “F” no nibble alto entre cada dígito. Transformando em x’F1F2F3F4C5 ‘.
Para convertê-lo de volta, basta inverter o processo. Usando java, isso seria parecido com:
byte[] myDecimal = { 0xF1, 0xF2, 0xF3, 0xF4, 0xF5 }; byte[] myPacked = new byte[3]; //Even low nibble moved to high nibble and merged with odd low nibble myPacked[0] = ((myDecimal[0] & 0b00001111) << 4)) | (myDecimal[1] & 0b00001111); myPacked[1] = ((myDecimal[2] & 0b00001111) << 4)) | (myDecimal[3] & 0b00001111); //Last byte gets filpped for sign myPacked[2] = ((myDecimal[5] & 0b00001111) << 4)) | (myDecimal[4] & 0b00001111);
Quando mexi no COMP-3 no passado com Java, acabei escrevendo um método para ler os bytes e convertê-los em um número. Eu acho que nunca tive que escrever COMP-3, mas eu suponho que eu usaria a mesma lógica ao contrário.