我问了一个关于转换COMP字段的问题,我没有得到任何答案。
我希望堆栈溢出能在这个问题上对我有所帮助。
我成功地将COMP-3转换为decimal。我需要你的帮助,在任何高级编程语言,但最好是在Java或c#.net的COMP-3转换解压后的十进制。
发布于 2010-12-03 15:08:47
在压缩十进制中,-123表示为X'123d‘(最后一个nyble c、d或f是符号)。处理压缩十进制的最简单方法之一是简单地将字节转换为十六进制字符串(如果需要,反之亦然),然后使用常规字符串操作。这可能不是最有效的,但它很容易实现。
因此,将Integer (值)转换为压缩小数大致是(注意:我还没有测试代码)
String sign = "c";
if (value < 0) {
sign = "d";
value = -1 * value;
}
String val = value + "d"
byte[] comp3Bytes = new BigInteger(val, 16).toByteArray();以下是一些示例代码,用于转换为comp3,以便从字节数组中检索压缩十进制请参见http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Common/Conversion.java?revision=3&view=markup中的方法getMainframePackedDecimal
要设置压缩小数,请参阅http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Types/TypePackedDecimal.java?revision=3&view=markup中的setField
这两个例程都接受一个字节数组、一个开始位置和一个字段位置的长度。
在web上还有其他这样做的例子(我认为JRanch也有做转换的代码),做一些谷歌搜索。
发布于 2010-12-03 05:19:31
将分区小数转换为comp-3非常简单--翻转低位字节的半字节,并去掉所有其他字节的高位半字节。
考虑数字12345 --在压缩十进制记数法中,它将是一个x'12345C‘或x'12345F’(C和F都是+,A、B和D都是-)。当您将其转换为区域小数时,您翻转了低位半字节,并在每个数字之间的高位半字节中插入了一个"F“。把它变成x'F1F2F3F4C5‘。
要将其转换回来,只需反转过程即可。使用java,它看起来像这样:
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);发布于 2010-12-03 01:41:28
当我在过去使用Java处理过COMP-3时,我最终编写了一个方法来读取字节并将它们转换为一个数字。我不认为我必须写出COMP-3,但我假设我会使用相反的相同逻辑。
https://stackoverflow.com/questions/4337912
复制相似问题