Como converter decimais descompactado de volta para COMP-3?

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.