@1977kobayashi

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ど素人です、アドバイスがもらえると助かります

解決したいこと

プログラミング未経験の者ですが
windowsのフリーソフトで使っていたソフトのコードが有りまして
アンドロイド端末で使用したいと思い
まったくの無知なのでchatGPTに質問してKotlinに変換してもらいました
何とか動作するところまでになったのですが
入力した数値に対して出力が同じになりません
c#のコードとchatGPTの出力したコードを比較してアドバイスしていただけると助かります

入力した数値ですが 100110034e601a10 です
windowsソフトの出力は 0A580C60 なのですが
変換して動作しているapkでの出力は 50600002 となります

該当するソースコード

// calculator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// calculator.MainWindow
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Windows;

private void Посчитать(object sender, RoutedEventArgs e)
{
	if (ИсходноеЧисло.Text.Count() != 16)
	{
		MessageBox.Show("Должно быть 16 символов", "Ошибка");
		return;
	}
	bool flag = true;
	string text = "AaBbCcDdEeFf1234567890";
	string text2 = ИсходноеЧисло.Text;
	foreach (char c in text2)
	{
		string text3 = text;
		foreach (char c2 in text3)
		{
			if (c == c2)
			{
				flag = false;
			}
		}
		if (flag)
		{
			MessageBox.Show("Введен неправильный символ", "Ошибка");
			return;
		}
		flag = true;
	}
	int num = int.Parse(ИсходноеЧисло.Text.Substring(0, 8), NumberStyles.HexNumber);
	int num2 = int.Parse(ИсходноеЧисло.Text.Substring(8, 8), NumberStyles.HexNumber);
	List<char> list = Convert.ToString(num2, 2).ToList();
	list.Reverse();
	while (list.Count < 32)
	{
		list.Add('0');
	}
	List<char> list2 = Convert.ToString(num, 2).ToList();
	list2.Reverse();
	while (list2.Count < 32)
	{
		list2.Add('0');
	}
	list2.Reverse();
	for (int k = 0; k < 32; k++)
	{
		if (list2[k] == list[k])
		{
			list2[k] = '0';
		}
		else
		{
			list2[k] = '1';
		}
	}
	num = (int)Convert.ToUInt64(new string(list2.ToArray()), 2);
	num -= 234949137;
	List<char> list3 = Convert.ToString(num, 16).ToList();
	list3.Reverse();
	while (list3.Count < 8)
	{
		list3.Add('0');
	}
	list3.Reverse();
	Результат.Text = new string(list3.ToArray()).ToUpper();
}

該当するソースコード

package com.example.calculator

import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    private lateinit var inputText: EditText
    private lateinit var resultText: TextView
    private lateinit var calculateButton: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        inputText = findViewById(R.id.inputText)
        resultText = findViewById(R.id.resultText)
        calculateButton = findViewById(R.id.calculateButton)

        calculateButton.setOnClickListener { calculate() }
    }

    private fun calculate() {
        val input = inputText.text.toString()
        if (input.length != 16) {
            Toast.makeText(this, R.string.input_error_length, Toast.LENGTH_SHORT).show()
            return
        }

        val allowedChars = "AaBbCcDdEeFf1234567890"
        if (!input.all { it in allowedChars }) {
            Toast.makeText(this, R.string.input_error_invalid_character, Toast.LENGTH_SHORT).show()
            return
        }

        try {
            val num1 = input.substring(0, 8).toLong(16).toInt()
            val num2 = input.substring(8, 16).toLong(16).toInt()

            // 32ビットに揃える
            val bin2 = num2.toString(2).padStart(32, '0').reversed()
            val bin1 = num1.toString(2).padStart(32, '0').reversed()

            // ビット演算
            val resultBin = bin1.zip(bin2) { b1, b2 -> if (b1 == b2) '0' else '1' }.reversed().joinToString("")

            // 結果を符号なし整数として扱う
            var resultNum = resultBin.toULong(2).toLong()
            resultNum -= 234949137

            // 結果を16進数文字列に変換
            val resultHex = resultNum.toString(16).padStart(8, '0').uppercase()

            resultText.text = resultHex
        } catch (e: Exception) {
            Toast.makeText(this, R.string.input_error_invalid_character, Toast.LENGTH_SHORT).show()
        }
    }
}

何卒宜しくお願い致します

1 likes

1Answer

以下の2箇所が違います

package com.example.calculator

import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    private lateinit var inputText: EditText
    private lateinit var resultText: TextView
    private lateinit var calculateButton: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        inputText = findViewById(R.id.inputText)
        resultText = findViewById(R.id.resultText)
        calculateButton = findViewById(R.id.calculateButton)

        calculateButton.setOnClickListener { calculate() }
    }

    private fun calculate() {
        val input = inputText.text.toString()
        if (input.length != 16) {
            Toast.makeText(this, R.string.input_error_length, Toast.LENGTH_SHORT).show()
            return
        }

        val allowedChars = "AaBbCcDdEeFf1234567890"
        if (!input.all { it in allowedChars }) {
            Toast.makeText(this, R.string.input_error_invalid_character, Toast.LENGTH_SHORT).show()
            return
        }

        try {
            val num1 = input.substring(0, 8).toLong(16).toInt()
            val num2 = input.substring(8, 16).toLong(16).toInt()

            // 32ビットに揃える
            val bin2 = num2.toString(2).padStart(32, '0').reversed()
-           val bin1 = num1.toString(2).padStart(32, '0').reversed()
+           val bin1 = num1.toString(2).padStart(32, '0')

            // ビット演算
-           val resultBin = bin1.zip(bin2) { b1, b2 -> if (b1 == b2) '0' else '1' }.reversed().joinToString("")
+           val resultBin = bin1.zip(bin2) { b1, b2 -> if (b1 == b2) '0' else '1' }.joinToString("")

            // 結果を符号なし整数として扱う
            var resultNum = resultBin.toULong(2).toLong()
            resultNum -= 234949137

            // 結果を16進数文字列に変換
            val resultHex = resultNum.toString(16).padStart(8, '0').uppercase()

            resultText.text = resultHex
        } catch (e: Exception) {
            Toast.makeText(this, R.string.input_error_invalid_character, Toast.LENGTH_SHORT).show()
        }
    }
}
1Like

Comments

  1. @1977kobayashi

    Questioner

    返信ありがとうございます
    修正してみたところ計算結果が期待していた数値になりました
    ですが別の数値を入力して比較したところ
    また結果に違いが出てしまいました

    サンプルの入力数値は
    入力が 00c02ee200000000 の時、結果が F2BF24D1
    入力が 1011025291960001 の時、結果が 821061CA
    でした、何が違うのでしょうか

  2. 以下の4箇所を変更してください。

    package com.example.calculator
    
    import android.os.Bundle
    import android.widget.Button
    import android.widget.EditText
    import android.widget.TextView
    import android.widget.Toast
    import androidx.appcompat.app.AppCompatActivity
    
    class MainActivity : AppCompatActivity() {
        private lateinit var inputText: EditText
        private lateinit var resultText: TextView
        private lateinit var calculateButton: Button
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            inputText = findViewById(R.id.inputText)
            resultText = findViewById(R.id.resultText)
            calculateButton = findViewById(R.id.calculateButton)
    
            calculateButton.setOnClickListener { calculate() }
        }
    
        private fun calculate() {
            val input = inputText.text.toString()
            if (input.length != 16) {
                Toast.makeText(this, R.string.input_error_length, Toast.LENGTH_SHORT).show()
                return
            }
    
            val allowedChars = "AaBbCcDdEeFf1234567890"
            if (!input.all { it in allowedChars }) {
                Toast.makeText(this, R.string.input_error_invalid_character, Toast.LENGTH_SHORT).show()
                return
            }
    
            try {
                val num1 = input.substring(0, 8).toLong(16).toInt()
                val num2 = input.substring(8, 16).toLong(16).toInt()
    
                // 32ビットに揃える
    -           val bin2 = num2.toString(2).padStart(32, '0').reversed()
    +           val bin2 = Integer.toBinaryString(num2).padStart(32, '0').reversed()
    -           val bin1 = num1.toString(2).padStart(32, '0')
    +           val bin1 =  Integer.toBinaryString(num1).padStart(32, '0')
    
                // ビット演算
               val resultBin = bin1.zip(bin2) { b1, b2 -> if (b1 == b2) '0' else '1' }.joinToString("")
    
    -           // 結果を符号なし整数として扱う
    +           // 結果を符号付き整数として扱う
    -           var resultNum = resultBin.toULong(2).toLong()
    +           var resultNum = Integer.parseUnsignedInt(resultBin, 2)           
                resultNum -= 234949137
    
                // 結果を16進数文字列に変換
    -           val resultHex = resultNum.toString(16).padStart(8, '0').uppercase()
    +           val resultHex = Integer.toHexString(resultNum).padStart(8, '0').uppercase()
    
                resultText.text = resultHex
            } catch (e: Exception) {
                Toast.makeText(this, R.string.input_error_invalid_character, Toast.LENGTH_SHORT).show()
            }
        }
    }
    
  3. @1977kobayashi

    Questioner

    ありがとうございます
    求めていた結果になりました
    大変助かりました、ありがとうございます

  4. 参考


    解決であれば、当Q&Aをクローズしてください

Your answer might help someone💌