5

我曾问过一个关于转换 COMP 字段的问题,但我没有得到任何答案。

我希望堆栈溢出可以帮助我解决这个问题。

我成功地将 COMP-3 转换为十进制。我需要您的帮助,将解压的十进制转换回 COMP-3,使用任何高级编程语言,但最好使用 Java 或 c#.net。

4

3 回答 3

3

在压缩十进制中,-123 表示为 X'123d'(最后一个 nyble c、d 或 f 是符号)。处理压缩十进制的最简单方法之一是将字节简单地转换为十六进制字符串(或根据需要反之亦然),然后使用正常的字符串操作。这可能不是最有效的,但很容易实现。

所以将整数(值)转换为压缩十进制大致是(注意:我没有测试过代码)

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中的 getMainframePackedDecimal 方法/net/sf/JRecord/Common/Conversion.java?revision=3&view=markup

并设置压缩十进制见http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Types/TypePackedDecimal.java?revision=3&view中的 setField =标记

这两个例程都采用一个字节数组、一个起始位置和一个字段位置的长度。

在网上还有其他这样做的例子(我认为 JRanch 也有进行转换的代码),做一些谷歌搜索。

于 2010-12-03T07:08:47.443 回答
2

将分区十进制转换为 comp-3 非常简单——翻转低字节的半字节并去掉所有其他字节的高半字节。

考虑数字 12345 - 在压缩十进制表示法中,这将是 x'12345C' 或 x'12345F'(C 和 F 都是 +,AB 和 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-02T21:19:31.300 回答
0

当我过去用 Java 弄乱 COMP-3 时,我最终编写了一个方法来读取字节并将它们转换为数字。我认为我不必写出 COMP-3,但我认为我会反过来使用相同的逻辑。

于 2010-12-02T17:41:28.077 回答