如何使用PIC S9(04) COMP转换EBCDIC编码文件。转换为整数值?
该文件的第一行包含1234,第二行包含-1234。
二进制文件:
0101100011010010101100000101000011101111011000001011000001010000
示例:

发布于 2021-05-08 10:28:30
如何使用PIC S9(04) COMP转换EBCDIC编码文件。转换为整数值?
别干那事。
在文件转换期间,使用EBCDIC将二进制数据转换为ASCII表。04 D2 (+1234)已转换为1A 4B。04 (EBCDIC SEL)已更改为1A (ASCII SUB),因为该转换没有等效项。D2 (EBCDIC 'K')改为4B (ASCII 'K')。由于SUB的原因,无法反转转换。-1234的转换也存在同样的问题。
最好的选择是使用PIC +9(04),它在转换之前和之后都是+1234或-1234。
使用写入文件的PIC +9(04)测试数据
+1234
-1234
+0001
-0001
+0000测试程序
using System;
using System.IO;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string path = "z:e1.txt";
using (StreamReader sr = new StreamReader(path))
{
while (sr.Peek() >= 0)
{
String s = sr.ReadLine();
short n = Int16.Parse(s);
Console.WriteLine(n);
}
}
}
}
}显示结果
1234
-1234
1
-1
0发布于 2021-05-08 19:47:57
具有计算性用法的COBOL数据类型(COMP、COMP-n)是而不是文本,因此您不能对它们执行任何字符转换操作。
计算类型存储为二进制数、浮点数或压缩十进制数。COMP是二进制的。长度取决于PIC子句中9的数量。请注意,二进制类型以big-endian格式存储。
在您的示例中,PIC +9(4)分别占用两个字节。例如。如果你看到
0x1234作为输入数据中PIC +9(4) COMP字段的十六进制表示,这表示数字(0x12 * 0x100) + 0x34,以十进制(18 * 256) + 52 = 4608 + 52 = 4660表示。
总之,包含PIC ... USAGE DISPLAY和PIC ... USAGE COMP-n类型字段的混合数据(记录)绝不能转换,而必须拆分成单独的字段,并且每个字段都必须根据其USAGE类型进行处理。
https://stackoverflow.com/questions/67442787
复制相似问题